(使用Caffe的)卷積神經網絡設計中遇到的問題


這兩天在折騰Caffe的時候遇到過各種奇怪的問題,拿幾個感覺比較重要的來說一下。之后想到什么再追加。

GPU運算無法正常使用

環境預載期錯誤(3 vs. 0)

Check failed: status == CUDNN_STATUS_SUCCESS (3 vs. 0)  CUDNN_STATUS_BAD_PARAM

似乎是因為有其他設備在使用GPU導致的,我的情況是等待一段時間就好了。

網絡加載期錯誤(2 vs. 0)

Check failed: error == cudaSuccess (2 vs. 0)  out of memory

不清楚具體是顯存還是內存空間不足引致的,一般考慮減少卷積層卷積核數目、減少全鏈接層輸出數目或者掏錢買內存。

模型訓練失敗

如果模型在訓練結束后的Accuracy非常糟糕,大致可以斷言模型的訓練失敗了。模型訓練的失敗有很多可能的原因,需要看訓練Log來判定。當然,判斷模型在一特定迭代位置是否應該完成訓練取決於數據量和模型的結構復雜度,有的要10k+迭代才勉強能用,有的1k+次迭代就非常精准了,在訓練時Accuracy和Loss也會上下波動(甚至是巨大的波動,我給嚇到過幾次),要仔細判斷是真的出了問題還是單純的迭代沒跑夠。

Loss在某一數值附近上下波動

這種情況如果持續多次可以認為模型無法收斂。其特征是Loss首先緩慢下降,然后突然上升。這也有例外,因為模型在收斂之后也會進入這種狀態,Accuracy和Loss進入期望范圍的話就可以結束訓練了。

標簽編號

圖像數據的標簽編號是從0開始的,在Caffe內部作為列表索引使用。因為網絡輸出0永遠是錯的,而標簽中的N從來沒被成功匹配過,給定從1開始的標簽會導致模型無法收斂的問題。

Weight或Bias未隨機初始化

原來以為只要Weight隨機初始化就可以了,沒想到Bias沒有隨機初始化也會導致模型無法收斂的問題。在一切看上去沒什么問題的時候,如果模型實在無法收斂,可以考慮一下這種情況。

Loss保持不變或長期停留在某一數值附近

圖像通道順序

在Caffe中,圖像讀取的結果以BGR方式儲存,熟悉圖像文件格式的同學可能會留意到,這是BMP文件的通道排列方式。而JPEG和PNG等更常用的壓縮格式的排列通常為RGB,因此要使用Transformer將其通道重排。

ReLU激勵層

ReLU激勵層默認會將負的梯度重設為0以避免模型發散,但是有的時候短暫的發散是訓練過程中必要的,注意配置參數中的negative_slope 屬性,這個屬性會與負梯度相乘,默認為0。將其設為1或一些比較小的數字能夠解決ReLU層卡死Loss的問題。

激勵層特性

ReLU和Sigmoid等激勵函數不同,ReLU能夠原位(In-place)進行激勵操作而不需要分配額外的內存,在鏈接網絡圖時注意區分其用法。正確的ReLU連接應使其Top和Bottom參數指向同一連接點。錯誤得使用ReLU層_可能_會導致激勵失敗,引致一些神奇的狀況。

模型發散

這一般是學習率過高造成的。經驗上取LearningRate=0.001較為合適。

Predict異常

Predict結果基本保持不變

圖像數據尺度

因為使用[0, 1]范圍內的浮點數能提升其精度(參見IEEE關於浮點數的標准,-1~1之間的浮點數取值是最密集的),通常使用Caffe訓練模型時會將分布於[0, 255]的通道量編碼到[0, 1]。如果傳入的圖像沒有經過編碼會導致一系列非常大的數據在神經網絡中傳播,最終導致恆定輸出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM