日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CNN训练注意事项与框架使用

發布時間:2024/9/30 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CNN训练注意事项与框架使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、CNN訓練注意事項

神經網絡訓練采用的方法是SGD,嚴格意義上是Mini-batch SGD。過程如下:

1、SGD過程

不斷循環如下過程:
(1)采樣一個 batch 數據(比如 32 張 , 可以做鏡像對稱):即每次是在這32張圖片里求梯度,不是全局也不是一張。在采樣數據的過程中可以對圖像做鏡像對稱,鏡像對稱并不影響圖像內容。
(2)前向計算得到損失loss。
(3)反向傳播計算一個batch上的梯度。為什么是一個batch上的梯度而不是一張圖片上的梯度呢?因為一張一張的做非常耗時間,而且損失函數并不是嚴格意義上的下降,而是振蕩下降,如果只用一張圖片則振蕩會非常大甚至會上升一段時間再下降。
(4)用這部分梯度迭代更新權重參數。

如上圖所示除了SGD之外還有一些其它方法,SGD是一階的,采用高階的方法可能會快一些,但是在CNN卷積神經網絡上做最優化常用的方法還是SGD。

2、兩種去均值方式

1、提取整張圖像的均值:把這張圖片的所有像素點求平均。
2、提取每個通道的均值:對每張圖片RGB三個顏色通道分別求均值,最后拿到的數字是3個。

3、權重初始化

3.1、初始化為0

我們思考當給每個權重初始值W=0會發生什么呢?

當W=0時不管中間有沒有加激勵函數,最后拿到的4個神經元的輸入即輸出層的值都一摸一樣,再往后推一層,因為后面權重W還是為0,所以輸出層的值還是一樣。

3.2、以很小的隨機數來初始化W

我們發現給W初始化都為0的方法不可行,所以我們想到可以給W一個很小的隨機數。例如從均值為0,方差為0.01的高斯分布中取值即從0到0.01之間隨機選取一些值去初始化網絡結構。目的是讓激勵過后的結果可以符合正態分布。

這種方法對于層次不深的神經網絡是可行的,但是一旦作用在深層網絡中很容易帶來整個網絡的不對稱性。
假設將此方法作用在10層神經網絡上,這10層神經網絡共有500個神經元,我們使用tanh作為激勵函數。過程如下:

輸出:


打印出來的第一個部分是層次,第二個部分是當前隱層經過激勵函數拿到的均值。,只看均值是不夠的,還要看方差即波動的情況。做完一遍前向運算后均值如上圖上側左邊部分所示,下側是將均值變化函數畫成圖的樣子。我們發現從正態分布取出的值去初始化權重這種方法在第一個隱層沒有問題,應為W是正態分布過來的,人為的保持了對稱性。均值為-0.000117,方差為0.213081,有波動;但是當傳到第二層時均值減小了,方差的變化也很小;再往后傳的話會發現在所有場景下拿到的均值和方差都一樣,都接近0,這時再做反向傳播時就學不到東西了。

3.3、取輸入層與輸出層結點個數之間的一個值

基于上述方法無法應用到多層神經網絡, 后來又提出了另一個取W的方式,即取輸入層和輸出層結點個數之間的一個值。

從上圖中我們看到取的值較大也會有問題,當值較大時經過激勵函數tanh之后拿到輸出結果的均值和方差后會發現均值和方差在頻繁的跳,要么是1,要么是-1,基本飽和了。

3.4、Xavier initialization

后來又提出一種方法是W取輸入層與輸出層結點個數再除以輸入層結點個數的平方根。

結果如下:

采用這種方式使用tanh作為激勵函數時正常。我們希望輸出的方差和輸入的方差處在同樣的大小,即波動范圍一樣,但是當我們使用ReLU激勵函數后會出現中斷。
如下圖所示:

當我們將除以輸入個數的平方根換成輸入個數除以2的平方根就正常了。
如下圖所示:


上圖所示我們會發現直到最后一層都能維持住方差的波動。

上圖是損失函數逐漸衰減的過程。

3.5、Batch Normalization

我們發現輸出結果受W的影響,但是又不能每次去手動調W,所以我們希望有一套規則不管W怎么樣都能約束住最后的結果值。只要每次用這個規則對輸出結果做一遍處理,就能讓結果值處于一個可控的高斯分布狀態。

BN通常在全連接層,全連接層兩兩之間都會有一個權重組合,后一層的其中一個神經元是由前一層所有神經元的W和x線性組合而成,所以會導致次神經元的波動性可能會更大,由此會把約束這一層放在FC后面。
BN學習過程:

BN的輸入是全連接層的輸出,要學習γ\gammaγβ\betaβ兩個參數。由上圖我們看到有m個輸入,對m個輸入求均值得到μ\muμ,有了μ\muμ又求得方差。然后根據根據均值和方差把x化到一個符合正態分布的輸入,γ\gammaγβ\betaβ的作用就是對做過正態分布約束的輸出做一個線性的組合作為tanh的輸入。

Batch Normalization的優點:
(1)梯度計算更為順暢;
(2)學習率設高一點也沒關系;
(3)對于初始值的依賴減少了;
(4)也可以看做一種正則化 , 減少了對 dropout的需求 。
注意在訓練中途要去看一個神經網絡是否工作正常,先取一個非常小的神經網絡,先跑一下看看能不能收斂到準確度為1的程度,因為如果在一小部分中都沒有收斂到1的話那么一定是代碼的實現有問題。

4、正則化(Dropout)

神經網絡正則化方式:別一次開啟所有學習單元。

如上圖所示,dropout做的事情就是在做一次前向運算時,會給每一個神經元都加一個開關,會隨機的把里面一部分開關關掉。
注意:在實際工程中可以按上述方法來做,但是在做預測時會很麻煩。所以在實際工程中不會中途把開關打開或者關上,而是給所有x乘以概率p。后來想到一個更好的方法就是在訓練時將所有x都除以概率p,這時做預測時就不用做任何處理了。

正則化方法可以防止過擬合,因為神經元的記憶力非常好,如果記的太清楚的話會出現問題。假如貓有一只耳朵,神經元記住了有耳朵的就是貓,但是狗也有一只耳朵。這樣就會出現識別錯誤的現象。所以需要有泛化能力。

二、caffe框架使用

1、特點

(1)來源于 Berkeley 的開源框架;
(2)由C++ 完成;
(3)有 python 和 mathlab 的接口;
(4)對于卷積神經網絡的訓練和 fine-tuning 非常方便。

2、主要的類\模塊

(1)Blob:主要用來表示網絡中的數據,包括訓練數據,網絡各層自身的參數(包括權值、偏置以及它們的梯度),網絡之間傳遞的數據都是通過 Blob 來實現的,同時 Blob 數據也支持在 CPU 與 GPU 上存儲,能夠在兩者之間做同步。
(2)Layer:是對神經網絡中各種層的一個抽象,包括我們熟知的卷積層和下采樣層,還有全連接層和各種激活函數層等等。同時每種 Layer 都實現了前向傳播和反向傳播,并通過 Blob 來傳遞數據。
(3)Net:是對整個網絡的表示,由各種 Layer 前后連接組合而成,也是我們所構建的網絡模型。
(4)Solver:定義了針對 Net 網絡模型的求解方法,記錄網絡的訓練過程,保存網絡模型參數,中斷并恢復網絡的訓練過程。自定義 Solver 能夠實現不同的網絡求解方式。

3、使用方法

3.1 Resize 圖片 ,轉換存儲格式

3.2 定義網絡結構(編輯 prototxt )

3.3 定義 solver (編輯另一個 prototxt )

3.4 訓練(可以基于已有的權重賦值 , 跑一個腳本 )

4、關于fine-tuning

如果層次不變,只需修改輸入和輸出。

如果層次改變,則需要手動添加\刪減層次:

fine-tuning技巧/注意點:
(1)優先學習權放在新加層:每一層都有控制學習率的參數: blobs_lr,通常情況下我們 一般會把前面層學習率調低,最后新加層調高,甚至可以freeze前面的層次不動。一般fine-tuning的前期loss下降非???#xff0c;中間有個瓶頸期,要有耐心。
(2)在solver處調整學習率:調低solver處的學習率,記住存儲一下中間結果,以免出現意外。

總結

以上是生活随笔為你收集整理的CNN训练注意事项与框架使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。