蘭州大學(xué)在讀碩士研究生,主攻無人駕駛,深度學(xué)習(xí);蘭大未來計(jì)算研究院無人車團(tuán)隊(duì)骨干,在改自己的無人車,參加過很多無人車Hackathon,喜歡極限編程。
在前幾十年,神經(jīng)網(wǎng)絡(luò)并沒有受到人們的重視,直到深度學(xué)習(xí)的出現(xiàn),人們利用深度學(xué)習(xí)解決了不少實(shí)際問題(即一些落地性質(zhì)的商業(yè)應(yīng)用),神經(jīng)網(wǎng)絡(luò)才成為學(xué)界和工業(yè)界關(guān)注的一個(gè)焦點(diǎn)。本文以盡可能直白,簡(jiǎn)單的方式介紹深度學(xué)習(xí)中三種典型的神經(jīng)網(wǎng)絡(luò)以及深度學(xué)習(xí)中的正則化方法。為后面在無人駕駛中的應(yīng)用做鋪墊。
▌深度學(xué)習(xí)的能力
近期在學(xué)術(shù)領(lǐng)域存在這許多批判深度學(xué)習(xí)的言論(參考Gary Marcus的文章:https://arxiv.org/ftp/arxiv/papers/1801/1801.00631.pdf),深度學(xué)習(xí)在一些學(xué)者看來并不是通往通用人工智能的道路。但是,作為關(guān)注行業(yè)應(yīng)用的研究者和工程師,我們并不需要關(guān)注深度學(xué)習(xí)到底是不是通往最終的通用人工智能的道路,我們只需要知道,深度學(xué)習(xí)到底能不能夠解決我們行業(yè)的一些問題(通過傳統(tǒng)的軟件工程很難解決的問題)?答案是能,正是因?yàn)樯疃葘W(xué)習(xí)有著這樣的能力,它才成為人工智能研究領(lǐng)域歷史上第一次為各大商業(yè)公司追逐的技術(shù)(以往的人工智能大多是實(shí)驗(yàn)室產(chǎn)品,從未吸引巨頭的大量資本投入)。商業(yè)公司追逐利益,追逐商業(yè)化,一項(xiàng)技術(shù)能夠?yàn)闃I(yè)內(nèi)大量公司熱捧,說明其已經(jīng)具備在某些應(yīng)用行業(yè)商業(yè)化,產(chǎn)品化的能力,那么我們首先來了解一下深度學(xué)習(xí)現(xiàn)在已經(jīng)具備的“產(chǎn)品力”:
圖像識(shí)別與分類
傳統(tǒng)的計(jì)算機(jī)視覺技術(shù)在處理圖像識(shí)別問題時(shí)往往需要人為設(shè)計(jì)特征,要識(shí)別不同的類別,就要設(shè)計(jì)不同的特征,要識(shí)別貓和狗,就要分別為貓和狗設(shè)計(jì)特征,而這個(gè)過程是非常麻煩的,我們以貓和狗為例:
上圖是貓和狗的照片,可以說,光是為貓和狗兩個(gè)類別的識(shí)別設(shè)計(jì)特征就需要耗費(fèi)大量的精力,并且還得是“貓狗專家”才能做這件事情。那么,當(dāng)要識(shí)別的類別上升到1000類的時(shí)候呢?傳統(tǒng)的視覺算法的識(shí)別精度將會(huì)更低。
深度學(xué)習(xí)取得的第一個(gè)重大的突破就在ImageNet的識(shí)別挑戰(zhàn)上。
ImageNet是一個(gè)擁有1400萬張圖片的巨大數(shù)據(jù)集,基于ImageNet數(shù)據(jù)集,ILSVRC(ImageNet Large Scale Visual Recognition Challenge)挑戰(zhàn)賽每年舉辦一次。
自2012年AlexNet在ILSVRC上以遠(yuǎn)超第二名的識(shí)別率打破當(dāng)年的記錄以后,深度學(xué)習(xí)在ImageNet數(shù)據(jù)集上的識(shí)別率在近兩年取得了一個(gè)又一個(gè)的突破。到2015年,ResNet的top-5識(shí)別率正式超過人類:
目標(biāo)檢測(cè)
像素級(jí)別的場(chǎng)景分割
視頻字幕生成
游戲和棋牌
語音識(shí)別,文本生成,黑白影片自動(dòng)著色,雅爾塔游戲……
深度學(xué)習(xí)有著極強(qiáng)的表示能力,能夠處理復(fù)雜的任務(wù),自然,我們需要使用深度學(xué)習(xí)來解決無人駕駛中一直以來的問題(基于深度學(xué)習(xí)的計(jì)算機(jī)視覺,基于深度學(xué)習(xí)的決策,基于強(qiáng)化學(xué)習(xí)的決策等等)。下面我們就開始深度學(xué)習(xí)的相關(guān)基礎(chǔ)。
▌深度前饋神經(jīng)網(wǎng)絡(luò)——為什么要深?
在第九篇博客的末尾其實(shí)我們已經(jīng)接觸了深度前饋神經(jīng)網(wǎng)絡(luò),我們使用一個(gè)規(guī)模很大的深度前饋網(wǎng)絡(luò)來解決MNIST手寫字識(shí)別問題,我們的這個(gè)網(wǎng)絡(luò)取得了98%98%的識(shí)別率。簡(jiǎn)單來說,深度前饋網(wǎng)絡(luò)就是早前的三層BP網(wǎng)絡(luò)的“加深版”,如圖所示:
其中的層被我們稱為全連接層。那么根據(jù)前面的神經(jīng)網(wǎng)絡(luò)的介紹我們知道,即使僅僅使用3層的神經(jīng)網(wǎng)絡(luò),我們就能夠擬合任意函數(shù)了,神經(jīng)網(wǎng)絡(luò)在設(shè)計(jì)的時(shí)候往往遵循奧卡姆剃刀原則,即我們往往使用最簡(jiǎn)單的結(jié)構(gòu)來建模,那么為什么要加深網(wǎng)絡(luò)的層數(shù)呢?
這個(gè)問題要從兩個(gè)方面來看:一是大數(shù)據(jù)下的模型訓(xùn)練效率,一是表示學(xué)習(xí)。
大數(shù)據(jù)下的模型訓(xùn)練效率
有人把深度學(xué)習(xí)突破的起因歸結(jié)于三個(gè)要素:
神經(jīng)網(wǎng)絡(luò)理論(一直以來的理論基礎(chǔ))
大量數(shù)據(jù)(得益于互聯(lián)網(wǎng)的發(fā)展)
當(dāng)代更強(qiáng)的并行計(jì)算能力(以GPU計(jì)算為代表)
其中的大量數(shù)據(jù)是深度神經(jīng)網(wǎng)絡(luò)能夠在性能上取得成功的一個(gè)重要因素,傳統(tǒng)機(jī)器學(xué)習(xí)算法在數(shù)據(jù)量增大到一定的數(shù)量級(jí)以后似乎會(huì)陷入一個(gè)性能的瓶頸(即使是基于結(jié)構(gòu)風(fēng)險(xiǎn)最小化的支持向量機(jī),其性能也會(huì)在數(shù)據(jù)量到達(dá)一定程度以后飽和),但是神經(jīng)網(wǎng)路似乎是可以不斷擴(kuò)容的機(jī)器學(xué)習(xí)算法,數(shù)據(jù)量越大,可以通過增加神經(jīng)元的個(gè)數(shù)以及隱含層的層數(shù),訓(xùn)練更加強(qiáng)大的神經(jīng)網(wǎng)絡(luò),其變化趨勢(shì)大致如下:
但是我們之前的文章也提到,當(dāng)前已經(jīng)可以證明,僅僅是簡(jiǎn)單的三層神經(jīng)網(wǎng)絡(luò),通過增加隱含層神經(jīng)元數(shù)量,理論上也可以擬合任意函數(shù)。那么我們?yōu)槭裁床恢苯邮褂脝渭兊娜龑泳W(wǎng)絡(luò)結(jié)構(gòu),只增加隱含層神經(jīng)元數(shù)量來提高模型容量,從而擬合復(fù)雜問題呢?
單純的增加單層神經(jīng)元數(shù)量能夠是的模型具有更加強(qiáng)的表示能力,但是,相比于增加層數(shù),每層使用相對(duì)少的神經(jīng)元的策略,前者在實(shí)際訓(xùn)練中訓(xùn)練成功的難度更大,包含大量隱含層神經(jīng)元的三層網(wǎng)絡(luò)的過擬合問題難以控制,并且要達(dá)到相同的性能,深層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)往往要比三層網(wǎng)絡(luò)需要的神經(jīng)元更少。
表示學(xué)習(xí)
另一種對(duì)深度學(xué)習(xí)前若干層作用的解釋就是表示學(xué)習(xí)。深度學(xué)習(xí)=深度表示學(xué)習(xí)(特征學(xué)習(xí)),下圖是一個(gè)多層卷積網(wǎng)絡(luò)在輸入圖像以后,神經(jīng)網(wǎng)絡(luò)隱含層神經(jīng)元激活的可視化結(jié)果:
如圖,神經(jīng)網(wǎng)絡(luò)的前若干層實(shí)際上發(fā)揮這特征提取和表示建立的作用,區(qū)別與傳統(tǒng)機(jī)器學(xué)習(xí)方法的人為設(shè)計(jì)特征,神經(jīng)網(wǎng)絡(luò)的特征設(shè)計(jì)是伴隨著神經(jīng)網(wǎng)絡(luò)的訓(xùn)練而進(jìn)行的,是一個(gè)自動(dòng)的表示建立過程。從圖中我們還能發(fā)現(xiàn),越靠近輸入端的層(越底層)提取的特征越簡(jiǎn)單,層數(shù)越高建立的特征越復(fù)雜。比如說圖中,第一層提取了“邊緣”特征,第二層則提取了輪廓特征,那么到了第三個(gè)隱含層,通過組合簡(jiǎn)單的底層特征,綜合出了更加高級(jí)的表示,提取的是識(shí)別目標(biāo)的局部特征。通過對(duì)特征的逐層抽象化,神經(jīng)網(wǎng)絡(luò)的層數(shù)越多,其能夠建立的特征表示也就越豐富。
▌應(yīng)用于深度神經(jīng)網(wǎng)絡(luò)的正則化技術(shù)
當(dāng)神經(jīng)網(wǎng)絡(luò)的隱含層數(shù)和神經(jīng)元數(shù)量增大時(shí),隨之而來的是參數(shù)數(shù)量的大幅度增大。這是的我們的神經(jīng)網(wǎng)絡(luò)更加容易過擬合,即模型在訓(xùn)練集上表現(xiàn)好,但是泛化能力差。在機(jī)器學(xué)習(xí)中,許多策略顯式地被設(shè)計(jì)為減少測(cè)試誤差(可能會(huì)以增大訓(xùn)練誤差為代價(jià))。這些策略被統(tǒng)稱為正則化。
下面我們介紹四種常見的正則化技術(shù),它們分別是:
數(shù)據(jù)集增強(qiáng)(Data Agumentation)
提前終止(Early Stopping)
參數(shù)范數(shù)懲罰(Parameter Norm Penalties)
Dropout
數(shù)據(jù)集增強(qiáng)
增強(qiáng)機(jī)器學(xué)習(xí)魯棒性的最直觀的一個(gè)策略就是使用更多的數(shù)據(jù)來訓(xùn)練模型,即數(shù)據(jù)集增強(qiáng)。然而,在現(xiàn)實(shí)情況下,我們的數(shù)據(jù)是有限的,所以我們往往通過創(chuàng)建假數(shù)據(jù)來增加我們的數(shù)據(jù)集合,而對(duì)于某些機(jī)器學(xué)習(xí)任務(wù)而言(如圖像分類),創(chuàng)建假數(shù)據(jù)是非常簡(jiǎn)單的,下面我們以MNIST手寫字為例來說明:
上圖中的三個(gè)字符是MNIST數(shù)據(jù)集的訓(xùn)練集中的三個(gè)數(shù)字,對(duì)于圖像這樣的高維并且包含巨大的可變性的數(shù)據(jù),我們可以對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單的平移,旋轉(zhuǎn),縮放等等來產(chǎn)生新的數(shù)據(jù)。
def expend_training_data(train_x, train_y): """ Augment training data """ expanded_images = np.zeros([train_x.shape[0] * 5, train_x.shape[1], train_x.shape[2]]) expanded_labels = np.zeros([train_x.shape[0] * 5]) counter = 0 for x, y in zip(train_x, train_y): # register original data expanded_images[counter, :, :] = x expanded_labels[counter] = y counter = counter + 1 # get a value for the background # zero is the expected value, but median() is used to estimate background's value bg_value = np.median(x) # this is regarded as background's value for i in range(4): # rotate the image with random degree angle = np.random.randint(-15, 15, 1) new_img = ndimage.rotate(x, angle, reshape=False, cval=bg_value) # shift the image with random distance shift = np.random.randint(-2, 2, 2) new_img_ = ndimage.shift(new_img, shift, cval=bg_value) # register new training data expanded_images[counter, :, :] = new_img_ expanded_labels[counter] = y counter = counter + 1 return expanded_images, expanded_labelsagument_x, agument_y = expend_training_data(x_train[:3], y_train[:3])
得到5倍于原數(shù)據(jù)集的新數(shù)據(jù)集:
后面的四個(gè)圖像是我們通過一定的變換得到的,我們并沒有去采集新的數(shù)據(jù),通過創(chuàng)造假數(shù)據(jù),我們的數(shù)據(jù)集變成了原來的若干倍,這種處理方法能夠顯著提高神經(jīng)網(wǎng)絡(luò)的泛化能力,即使是具有平移不變性的卷積神經(jīng)網(wǎng)絡(luò)(我們后面會(huì)詳述),使用這種簡(jiǎn)單處理方式得到的新數(shù)據(jù)也能大大改善泛化。
提前終止
當(dāng)訓(xùn)練參數(shù)數(shù)量大的神經(jīng)網(wǎng)絡(luò)時(shí),即模型容量大于實(shí)際需求時(shí),神經(jīng)網(wǎng)絡(luò)最終總是會(huì)過擬合,但是我們總是能夠觀察到,訓(xùn)練誤差會(huì)隨著訓(xùn)練時(shí)間的推移逐漸降低,但是驗(yàn)證集的誤差卻會(huì)先降低后升高,如下圖所示:
那么基于這個(gè)現(xiàn)象,我們可以在每次觀察到驗(yàn)證集誤差有所改善以后保存一份模型的副本,如果誤差惡化,則將 耐心值 +1,當(dāng)耐心值到達(dá)一個(gè)事先設(shè)定的閾值的時(shí)候,終止訓(xùn)練,返回保存的最后一個(gè)副本。這樣,我們能夠得到整個(gè)誤差曲線中最低的點(diǎn)的模型。
參數(shù)范數(shù)懲罰
許多正則化方法會(huì)向神經(jīng)網(wǎng)絡(luò)的損失函數(shù)L(θ)添加一個(gè)懲罰項(xiàng)Ω(w),一次來約束模型的學(xué)習(xí)能力,形式如下:
其中的θ是包括權(quán)重和偏置(w,b)在內(nèi)的神經(jīng)網(wǎng)絡(luò)的參數(shù),需要注意的是,懲罰項(xiàng)往往只對(duì)仿射變換中的權(quán)重(即w)進(jìn)行懲罰,偏置單元b不會(huì)被正則化,原因在于:每個(gè)權(quán)重明確表明兩個(gè)變量之間是如何相互作用的。要將權(quán)重?cái)M合地很好,需要在各種不同的條件下觀察這些變量。每一個(gè)偏置只會(huì)控制一個(gè)單獨(dú)的變量,這也就意味著在保留不被正則化的偏置時(shí),不需要引入過多的方差。 同樣,對(duì)偏置參數(shù)進(jìn)行正則化會(huì)引入相當(dāng)程度的欠擬合可能。因此往往只對(duì)權(quán)重進(jìn)行懲罰。α是一個(gè)需要人為設(shè)置的超參數(shù),稱為懲罰系數(shù), 當(dāng)α為 0 的時(shí)候,表示沒有參數(shù)懲罰,α越大,則對(duì)應(yīng)的參數(shù)的懲罰也就越大。以 L2 正則化為例,我們?cè)趽p失函數(shù)的后面添加了的正則項(xiàng)為:
那么最小化權(quán)重的平方會(huì)帶來什么結(jié)果呢?
神經(jīng)網(wǎng)絡(luò)將傾向于使所有的權(quán)重都很小,除非誤差導(dǎo)數(shù)過大。
防止擬合錯(cuò)誤的樣本。
使得模型更加“光滑”,即輸入輸出敏感性更低,輸入的微小變化不會(huì)明顯的反映到輸出上。
如果輸入端輸入兩個(gè)相同的輸入,網(wǎng)絡(luò)的權(quán)重分配會(huì)傾向于均分權(quán)重而不是將所有的權(quán)重都分到一個(gè)連接上。
L2懲罰一方面降低了權(quán)重的學(xué)習(xí)自由度,削弱了網(wǎng)絡(luò)的學(xué)習(xí)能力,另一方面相對(duì)均勻的權(quán)重又能使模型光滑化,使模型對(duì)輸入的細(xì)微變化不敏感,從而增強(qiáng)模型的魯棒性。
Dropout
參數(shù)范數(shù)懲罰通過改變神經(jīng)網(wǎng)絡(luò)的損失函數(shù)來實(shí)現(xiàn)正則化,而Dropout則通過改變神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)來增強(qiáng)網(wǎng)絡(luò)的泛化能力,如圖是一個(gè)神經(jīng)網(wǎng)絡(luò)訓(xùn)練時(shí)的結(jié)構(gòu):??
我們?cè)诘谝粋€(gè)隱含層后面添加了一個(gè)Dropout層,Dropout 就是指隨機(jī)地刪除掉網(wǎng)絡(luò)中某層的節(jié)點(diǎn),包括該節(jié)點(diǎn)的輸入輸出的邊,如下圖所示:
這也等價(jià)與以一定的幾率保留節(jié)點(diǎn)。在本例中,p即保留節(jié)點(diǎn)的幾率,我們?cè)O(shè)置為50%, 在實(shí)踐中,保留概率通常設(shè)置在[0.5,1]。那么Dropout為什么有助于防止過擬合呢?簡(jiǎn)單的解釋就是,運(yùn)用了dropout的訓(xùn)練過程,相當(dāng)于訓(xùn)練了很多個(gè)只有半數(shù)隱層單元的神經(jīng)網(wǎng)絡(luò)(后面簡(jiǎn)稱為“半數(shù)網(wǎng)絡(luò)”),每一個(gè)這樣的半數(shù)網(wǎng)絡(luò),都可以給出一個(gè)分類結(jié)果,這些結(jié)果有的是正確的,有的是錯(cuò)誤的。隨著訓(xùn)練的進(jìn)行,大部分半數(shù)網(wǎng)絡(luò)都可以給出正確的分類結(jié)果,那么少數(shù)的錯(cuò)誤分類結(jié)果就不會(huì)對(duì)最終結(jié)果造成大的影響。
那么等到訓(xùn)練結(jié)束的時(shí)候,我們的我們的網(wǎng)絡(luò)可以看作是很多個(gè)半數(shù)網(wǎng)絡(luò)的集成模型,到應(yīng)用網(wǎng)絡(luò)的階段,我們就不再使用Dropout,即p=1,網(wǎng)絡(luò)的最終輸出結(jié)果是所有半數(shù)網(wǎng)絡(luò)的集成結(jié)果,其泛化能力自然就會(huì)更好。
▌基于深度前饋神經(jīng)網(wǎng)絡(luò)的交通信號(hào)識(shí)別
Belgium Traffic Sign Dataset 數(shù)據(jù)集
我們使用BelgiumTS(Belgium Traffic Sign Dataset)來做一個(gè)簡(jiǎn)單的識(shí)別實(shí)例,BelgiumTS是一個(gè)交通信號(hào)的數(shù)據(jù)集,包含62中交通信號(hào)。
訓(xùn)練集的下載連接:
http://btsd.ethz.ch/shareddata/BelgiumTSC/BelgiumTSC_Training.zip
測(cè)試集的下載鏈接:http://btsd.ethz.ch/shareddata/BelgiumTSC/BelgiumTSC_Testing.zip
此數(shù)據(jù)集在不采用科學(xué)上網(wǎng)的方式時(shí)下載速度偏慢。
▌數(shù)據(jù)的讀取和可視化
下載好數(shù)據(jù)以后,解壓,使用如下目錄結(jié)構(gòu)存放數(shù)據(jù):
data/Training/data/Testing/
該數(shù)據(jù)集的訓(xùn)練集和測(cè)試集均包含了62個(gè)目錄,表示62種交通信號(hào)。使用如下函數(shù)讀取數(shù)據(jù):
def load_data(data_dir): """Loads a data set and returns two lists: images: a list of Numpy arrays, each representing an image. labels: a list of numbers that represent the images labels. """ # Get all subdirectories of data_dir. Each represents a label. directories = [d for d in os.listdir(data_dir) if os.path.isdir(os.path.join(data_dir, d))] # Loop through the label directories and collect the data in # two lists, labels and images. labels = [] images = [] for d in directories: label_dir = os.path.join(data_dir, d) file_names = [os.path.join(label_dir, f) for f in os.listdir(label_dir) if f.endswith(".ppm")] # For each label, load it's images and add them to the images list. # And add the label number (i.e. directory name) to the labels list. for f in file_names: images.append(skimage.data.imread(f)) labels.append(int(d)) return images, labels # Load training and testing datasets.ROOT_PATH = "data"train_data_dir = os.path.join(ROOT_PATH, "Training")test_data_dir = os.path.join(ROOT_PATH, "Testing")images, labels = load_data(train_data_dir)
輸出訓(xùn)練集的類別數(shù)和總的圖片數(shù)量:
print("Unique Labels: {0} Total Images: {1}".format(len(set(labels)), len(images)))
Unique Labels: 62Total Images: 4575
我們顯示每一個(gè)類別的第一張圖片看看。
def display_images_and_labels(images, labels): """Display the first image of each label.""" unique_labels = set(labels) plt.figure(figsize=(15, 15)) i = 1 for label in unique_labels: # Pick the first image for each label. image = images[labels.index(label)] plt.subplot(8, 8, i) # A grid of 8 rows x 8 columns plt.axis('off') plt.title("Label {0} ({1})".format(label, labels.count(label))) i += 1 _ = plt.imshow(image) plt.show()display_images_and_labels(images, labels)
顯然,數(shù)據(jù)集的圖片并不是統(tǒng)一的尺寸的,為了訓(xùn)練神經(jīng)網(wǎng)絡(luò),我們需要將所有圖片resize到一個(gè)相同的尺寸,在本文中,我們將圖片resize到(32,32):
# Resize imagesimages32 = [skimage.transform.resize(image, (32, 32)) for image in images]display_images_and_labels(images32, labels)
輸出resize以后的圖片信息:
for image in images32[:5]: print("shape: {0}, min: {1}, max: {2}".format(image.shape, image.min(), image.max()))
shape: (32, 32, 3), min: 0.0, max: 1.0shape: (32, 32, 3), min: 0.13088235294117614, max: 1.0shape: (32, 32, 3), min: 0.057059972426470276, max: 0.9011967677696078shape: (32, 32, 3), min: 0.023820465686273988, max: 1.0shape: (32, 32, 3), min: 0.023690257352941196, max: 1.0
圖像的取值范圍已經(jīng)歸一化好了,下面我們使用TensorFlow構(gòu)造神經(jīng)網(wǎng)絡(luò)來訓(xùn)練一個(gè)深度前饋網(wǎng)絡(luò)識(shí)別這個(gè)交通信號(hào)。
數(shù)據(jù)預(yù)處理
我們對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,首先將三通道的RGB轉(zhuǎn)成灰度圖:
images_a = color.rgb2gray(images_a)display_images_and_labels(images_a, labels)
注意,這里現(xiàn)實(shí)的并不是灰度圖,原因在于我們使用了之前的display_images_and_labels函數(shù),只需要在該函數(shù)的imshow部分添加cmap='gray'即可顯示灰度圖。
我們使用前面的方法對(duì)數(shù)據(jù)進(jìn)行擴(kuò)充(將數(shù)據(jù)擴(kuò)充為原來的5倍),我們現(xiàn)實(shí)其中的三張圖片:
然后我們對(duì)數(shù)據(jù)進(jìn)行shuffle,并且把數(shù)據(jù)切分為訓(xùn)練集和驗(yàn)證集,并對(duì)標(biāo)簽進(jìn)行one-hot編碼:
from sklearn.utils import shuffleindx = np.arange(0, len(labels_a))indx = shuffle(indx)images_a = images_a[indx]labels_a = labels_a[indx]print(images_a.shape, labels_a.shape)train_x, val_x = images_a[:20000], images_a[20000:]train_y, val_y = labels_a[:20000], labels_a[20000:]train_y = keras.utils.to_categorical(train_y, 62)val_y = keras.utils.to_categorical(val_y, 62)print(train_x.shape, train_y.shape)
▌使用Keras構(gòu)造并訓(xùn)練深度前饋網(wǎng)絡(luò)
我們?nèi)匀皇褂蒙弦黄恼轮杏玫降纳疃惹梆伨W(wǎng)絡(luò),看看在這類復(fù)雜問題中的性能如何:
model = Sequential()model.add(Flatten(input_shape=(32, 32)))model.add(Dense(512, activation='relu'))model.add(Dropout(0.5))model.add(Dense(512, activation='relu'))model.add(Dropout(0.5))model.add(Dense(62, activation='softmax'))model.summary()model.compile(loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy']) history = model.fit(train_x, train_y, batch_size=128, epochs=20, verbose=1, validation_data=(val_x, val_y)) ### print the keys contained in the history objectprint(history.history.keys())model.save('model.json')
現(xiàn)實(shí)訓(xùn)練loss和驗(yàn)證loss為:
加載測(cè)試數(shù)據(jù)集,查看精度:
('Test loss:', 0.8060373229994661)('Test accuracy:', 0.7932539684431893)
我們的這個(gè)簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)在測(cè)試集合上取得了79%的精度,我們現(xiàn)實(shí)幾個(gè)測(cè)試樣本的預(yù)測(cè)結(jié)果:
雖然精度不高,但效果似乎還行。。當(dāng)然,這個(gè)例子只是一個(gè)入門的網(wǎng)絡(luò),首先,它拋棄了3通道的圖像,所以信息會(huì)有一定的損失,其次,全連接網(wǎng)絡(luò)的第一步就是把圖像向量化了,我們能不能使用更加深,更加符合圖片二維特征的網(wǎng)絡(luò)呢?我們?cè)诤竺娴奈恼轮欣^續(xù)探討!
完整代碼鏈接:
http://download.csdn.net/download/adamshan/10217607
原文鏈接:
https://blog.csdn.net/adamshan/article/details/79127573
-
無人駕駛
+關(guān)注
關(guān)注
98文章
4003瀏覽量
119917 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5442瀏覽量
120800
原文標(biāo)題:無人駕駛汽車系統(tǒng)入門:深度前饋網(wǎng)絡(luò),深度學(xué)習(xí)的正則化,交通信號(hào)識(shí)別
文章出處:【微信號(hào):AI_Thinker,微信公眾號(hào):人工智能頭條】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論