0
本文作者: 楊文 | 2018-02-28 11:54 |
雷鋒網(wǎng)AI研習(xí)社按:CS231n是斯坦福大學(xué)開設(shè)的計算機視覺與深度學(xué)習(xí)的入門課程,授課內(nèi)容在國內(nèi)外頗受好評。其配套的課后作業(yè)質(zhì)量也頗高,因此雷鋒網(wǎng)AI研習(xí)社在近期的線上公開課上請來了一位技術(shù)大牛為大家來講解這門課的配套作業(yè)。
本文根據(jù)AI研習(xí)社公開課上的直播視頻內(nèi)容整理而成,主要介紹CS231n 課后作業(yè)第二套Assignment 2的完成思路與重點部分代碼實現(xiàn)。如果你還沒開始聽CS231n,可直接點擊課程鏈接觀看回放視頻。
王煦中,CS碩士,主要研究方向為自然語言處理與深度學(xué)習(xí)。知乎專欄喵神大人的深度工坊(http://t.cn/RTc9wfy)作者,日語及ACGN愛好者。
分享主題:CS231n 課后作業(yè)第二講 : Assignment 2(含代碼實現(xiàn))作業(yè)鏈接:https://github.com/Observerspy/CS231n
分享提綱:
Part 1 Fully-connected Neural Network
Part 2 Batch Normalization
Part 3 Dropout
Part 4 Convolutional Networks
Part 5 Tensorflow on CIFAR-10
第一部分分享主要是全連接神經(jīng)網(wǎng)絡(luò),這里主要是對代碼進行模塊化,把每一層都抽象出來,分別實現(xiàn)每一層的前向和反向部分,實現(xiàn)多層神經(jīng)網(wǎng)絡(luò)。第二和第三部分講的是神經(jīng)網(wǎng)絡(luò)中兩個的重要技巧,對網(wǎng)絡(luò)訓(xùn)練有很大的提升。本次作業(yè)中比較難的部分是卷積神經(jīng)網(wǎng)絡(luò)的實現(xiàn),包括正向和反向的推導(dǎo)過程。
第一個部分是對代碼的模塊化處理,實現(xiàn)從兩層到多層神經(jīng)網(wǎng)絡(luò)。
關(guān)于Update rules
第一個改變是加入了動量更新,也就是慣性。第二個是RMSProp(自適應(yīng)學(xué)習(xí)率),第三個是Adam(兩者結(jié)合),其實是上面兩個方法的結(jié)合,如果拿不準使用哪個方法,就用Adam。
為什么需要BN(Batch Normalization )?
傳統(tǒng)機器學(xué)習(xí)往往需要對輸入數(shù)據(jù)做一個歸一化,通常使用的是零均值和方差歸一,這樣會保證輸入的數(shù)據(jù)特征會有比較好的分布,使得算法可以比好好的學(xué)習(xí)。對于深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò),使用BN使得每一層分布都保持在良好范圍內(nèi)。
BN的原理
在求均值,求方差,歸一化這三步做完之后,每一層的數(shù)據(jù)分布都是標準正太分布,導(dǎo)致其完全學(xué)習(xí)不到輸入數(shù)據(jù)的特征。BN第四步中最關(guān)鍵的是兩個參數(shù),這兩個參數(shù)對歸一化后的分母進行縮放和平移,通過網(wǎng)絡(luò)自己學(xué)習(xí)平移和縮放來保留一定的特征。
訓(xùn)練過程
前向就是計算minibatch的均值和方差,然后對minibatch做normalize和scale、shift。測試的時候沒有minibatch,通過使用基于momentum的指數(shù)衰減,從而估計出均值和方差。
反向過程
BN的作用
可以有效減緩過擬合,減小不好的初始化影響,可以用大一點的學(xué)習(xí)率。通常放在激勵函數(shù)前效果好一點。
Dropout 原理
訓(xùn)練時以概率P保留神經(jīng)元,測試時所有神經(jīng)元都參與。通常在測試的時候使用inverted dropout多移除一個p保證訓(xùn)練預(yù)測分布的統(tǒng)一。
Dropout的作用
可以有效緩解過擬合,通常dropout放在激勵函數(shù)的后面或者全連接層后。
接下里來看怎么實現(xiàn)一個卷積神經(jīng)網(wǎng)絡(luò)
卷積神經(jīng)網(wǎng)絡(luò)通常有三個單元結(jié)構(gòu),分別是卷積核,激活函數(shù),池化層。先看卷積核,首先明確輸入x和卷積核的形狀(數(shù)量,通道,高,寬)。
卷積核
這里的卷積和通信原理里的卷積還是稍有區(qū)別的,在這里其實只是卷積核和相應(yīng)的區(qū)域進行元素乘,然后求和,課程官網(wǎng)給的說明十分形象生動。
也就是每個卷積核分別在每個通道上和對應(yīng)區(qū)域進行元素乘,然后求和,對應(yīng)圖中:(-3(通道1元素乘后求和) + -1(通道2元素乘后求和) + 0 (通道3元素乘后求和))(三個通道求和) + 1(bias_0) = -3(out的第一個格子里的值)
所以,關(guān)鍵問題就是根據(jù)步長如何確定x對應(yīng)區(qū)域,這里需要對Hnew(下標i)和Wnew(下標j)進行雙循環(huán)。選好區(qū)域直接和每個卷積(下標k)核作元素乘就行了,注意sum的時候我們其實是在(C, H, W)上作的,因此axis=(1, 2, 3)。這時候一個輸出out[:, k , i, j]就計算好了。
所以上述一共套了i, j ,k三層循環(huán),循環(huán)完畢后out再加上bias就行了。注意b的形狀(F,),因此要先把b擴展成和out一樣的形狀:b[None, :, None, None](None相當(dāng)于np.newaxis)
以上就是前向計算,接下來是反向計算。
反向計算首先明確我們要求什么。求dx,dw和db。
卷積核的三個導(dǎo)數(shù)具體的求解過程,請關(guān)注AI慕課學(xué)院視頻回放。
池化層
pooling同樣有步長,確定輸出形狀的公式,計算輸出形狀并初始化,max pooling顧名思義就是取這個pooling大小區(qū)域內(nèi)的max值。注意axis=(2, 3)。
反向和ReLU、DropOut是類似的,也就是說只有剛才前向通過的才允許繼續(xù)傳遞梯度。
max_mask形狀是(HH, WW),為了和x_padded_mask形狀對應(yīng)也要擴展。然后dout和這個temp_binary_mask元素乘即可。同樣注意dout是由i,j確定的,因此形狀需要擴展。
以前我們做的BN形狀是(N, D),這里不過是將(N, C, H, W)reshape為(N*H*W, C)。
最后進入TensorFlow
這里強調(diào)一點,在使用BN時請務(wù)必注意:在你的優(yōu)化器上套上下面圖中的兩行代碼,另外需要注意tf.layers.batch_normalization()中的is_training(是一個tf.placeholder)在訓(xùn)練和測試時的設(shè)置,如果要使用dropout也是類似的。
以上就是本次的課后作業(yè)指導(dǎo)分享。
雷鋒網(wǎng)AI慕課學(xué)院提供本次視頻回放,歡迎觀看。
微信公眾號:AI研習(xí)社(ID: okweiwu)定期邀請各路大神直播分享,關(guān)注后第一時間與嘉賓直播互動。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。