深度学习第五课-训练注意事项与框架使用
生活随笔
收集整理的這篇文章主要介紹了
深度学习第五课-训练注意事项与框架使用
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
說明:本文是七月算法5月深度學(xué)習(xí)班第五次課聽課筆記。黃色標(biāo)注的部分為自己不太確定的部分。
訓(xùn)練
mini-batch SGD
神經(jīng)網(wǎng)絡(luò)使用mini-batch SGD訓(xùn)練得到最優(yōu)權(quán)重。訓(xùn)練過程如下:(以下參考了andrew ng的機(jī)器學(xué)習(xí)課程)例如訓(xùn)練樣本量m=3200,mini-batch 每次取32張
for ?i = 1,33,65,... 從i 開始取32個圖片樣本 前向計算得到中間變量a ?z 和 損失函數(shù)值 后向計算得到梯度 用這部分梯度更新權(quán)重
問:為什么使用batch而不使用一張圖片呢? 答:一張圖片樣本量不夠,容易發(fā)生振蕩。如果是一張圖片,就是隨機(jī)梯度下降了。?
兩種去均值方法
第一種:減去圖片每個像素的均值。在圖片的每個像素位求均值。例如樣本圖片是[32,32,3],將會得到[32,32,3]數(shù)組的平均值。每個樣本的不同像素減去對應(yīng)位置的均值。AlexNet使用該方法。 第二種:減去每個通道(channel)的均值。例如樣本圖片是[32,32,3],會得到3個平均值,分別表示R、G、B的均值。每個樣本不同通道的值減去對應(yīng)的均值。VGGNet使用該方法。 再次強(qiáng)調(diào):CNN訓(xùn)練不需要做標(biāo)準(zhǔn)化、PCA和白化權(quán)重初始化
SGD參數(shù)學(xué)習(xí)第一步就是權(quán)重初始化。權(quán)重初始化有多種方法。 al表示每層神經(jīng)單元值。W1表示從第一層到第二層的權(quán)重 方法1 ?w=0。不可以。所有權(quán)重初始化為0,這會發(fā)生對稱現(xiàn)象。例如a2=g(a1*W1)。所有W1=0,a2所有神經(jīng)單元的值就都相同了。而神經(jīng)網(wǎng)絡(luò)的不同神經(jīng)元是用來學(xué)習(xí)不同的知識點(diǎn)。這樣就引起了對稱性。不能好好工作了。
方法2 w=0.01*np.random.rand(D,H). ?初始化權(quán)重為一些小的隨機(jī)數(shù)。在python實(shí)現(xiàn)中,實(shí)現(xiàn)了權(quán)重正負(fù)數(shù)各一半。效果:該方法在包含1-2個隱藏層的網(wǎng)絡(luò)中是有效的。網(wǎng)絡(luò)層數(shù)加深,帶來整個網(wǎng)絡(luò)激活傳遞的不對稱性(會引起數(shù)據(jù)在很小或者特別大的范圍內(nèi)變動,也就是說方差趨于0,或者無窮)。 實(shí)現(xiàn):使用10層網(wǎng)絡(luò)(500)神經(jīng)元,觀察 每一層 神經(jīng)單元的 平均值 和方差。可以看到從第三層開始均值與方差幾乎不發(fā)生變化,接近0。
方法3 w=np.random.rand(fan_in,fan_out).?說明:fan_in = 這一層輸入元素的個數(shù),fan_out=這一層輸出元素的個數(shù)。效果:會出現(xiàn)梯度為0的情況,類似sigmoid函數(shù)出現(xiàn)的情況。 方法4 w=np.random.rand(fan_in,fan_out)/np.sqr(fan_in)?效果:效果還不錯可以使用。但是在使用ReLU激活函數(shù)的時候,同樣帶來整個網(wǎng)絡(luò)激活傳遞的不對稱性。 方法5 w=np.random.rand(fan_in,fan_out)/np.sqr(fan_in/2)這是一篇在2015年的論文中提到的方法。可以解決ReLU時發(fā)生的問題。
Batch Normalization
? ? ? ? 對于權(quán)重可能引起網(wǎng)絡(luò)激活的不對稱性問題,谷歌提出了一種解決方法Batch Normalization。思想是期望激勵過后的神經(jīng)元的值仍然能夠保持高斯分布。
問:為什么是高斯分布呢? 答:高斯分布簡單,方差可控。而且還滿足了同一層神經(jīng)元要有一定的差異性。 問題:BN放在什么問題? Batch Normalization通常接在全連接之后,激勵層之前。全連接層是產(chǎn)生波動最大可能性的地方,也是學(xué)習(xí)能力最強(qiáng)的地方。 問題:BN的具體操作 求均值;求方差;xi=(xi-均值)/np.sqr(方差+e);最后一步做伸縮和平移且輸出:yi=gama * xi+beta ? ? 。gama和beta是訓(xùn)練過程中可以獲得的。之所以有最后一步,是因?yàn)锽N過程中對原始數(shù)據(jù)做了修改,表達(dá)的信息會有部分丟失。通過伸縮平移盡量將信息還原。 BN的優(yōu)點(diǎn)是:學(xué)習(xí)率設(shè)置高一點(diǎn)也可以;對初始化數(shù)據(jù)依賴少了。
開始訓(xùn)練
首先先用小數(shù)據(jù)集訓(xùn)練(10個分類,每個分類下10個樣本)測試訓(xùn)練模型是否OK。接著可以改變正則化,從無到有。 需要監(jiān)控的參數(shù) 1const function的值是不是振蕩下降;2 訓(xùn)練集上的準(zhǔn)確率是否能到100%。 幾個現(xiàn)象:準(zhǔn)確率低(0.6),cost function值不變=>有問題,學(xué)習(xí)率太大了? 訓(xùn)練集準(zhǔn)確率>>交叉驗(yàn)證集準(zhǔn)確率 ? =>過擬合,試試調(diào)大正則化項(xiàng)? 訓(xùn)練集準(zhǔn)確率 約等于?交叉驗(yàn)證集準(zhǔn)確率 ? 如果都很高,那模型不錯,可以使用。如果都很低(0.6),數(shù)據(jù)問題?模型問題?樣本傾斜了?Dropout ---神經(jīng)網(wǎng)絡(luò)正則化
L2 正則化 ? ?l = ... + lamda*(權(quán)重和) ? ?用于神經(jīng)網(wǎng)絡(luò),參數(shù)個數(shù)多,計算量大。所以不是最好的選擇。 Dropout 語言描述:1 別一次打開所有學(xué)習(xí)單元;別讓神經(jīng)元記住那么多東西;每次關(guān)掉一部分感知器,得到新的模型,最后融合。 設(shè)置一個概率p=允許通過的概率。在dropout層,會有n*(1-p)個節(jié)點(diǎn)關(guān)閉,神經(jīng)單元的值為0。注意:不是權(quán)重為0。由于訓(xùn)練的時候有一個概率,在預(yù)測的時候同樣需要概率。所以工業(yè)上一般是在訓(xùn)練過程中,將輸入數(shù)據(jù)x=x*p。預(yù)測的時候就不需要再乘以p了。Caffe使用
主要模塊
Blob 存儲數(shù)據(jù)和梯度值 Layer 傳遞層與層的輸入輸出 Net ? 網(wǎng)絡(luò),利用前向后向計算梯度 Solver 用梯度更新權(quán)重? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
使用過程
網(wǎng)上有很多資料講使用過程,這里不詳細(xì)記錄。 1 Resize圖片,轉(zhuǎn)存為LMDB/LevelDB格式。注意分類下表從0開始。 2 定義網(wǎng)絡(luò)結(jié)構(gòu) 3 定義solver,訓(xùn)練參數(shù) 4 訓(xùn)練模型庫選擇 ?model zoo
1?如果層次不變,改變輸入輸出 輸入是 data層?data_param 和transform_param 參數(shù)段。輸出是layer {??name: "fc8" ?,name 需要修改。2 如果添加/刪除層次,注意順序。一般把前面層學(xué)習(xí)率調(diào)低,從修改層開始調(diào)高學(xué)習(xí)率。一般fine-tuning的前期loss下降非常快,中間有個瓶頸期,要有耐心。 3 在solver調(diào)整學(xué)習(xí)率(1/10,1/100)。利用snapshot 存儲中間結(jié)果。如果發(fā)生宕機(jī),可以接著繼續(xù)訓(xùn)練。
總結(jié)
以上是生活随笔為你收集整理的深度学习第五课-训练注意事项与框架使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平板电脑黑苹果EFI_保姆级别教你安装黑
- 下一篇: 【敏捷开发每日一贴】代码走查