深度学习中的 Batch_Size,以及learning rate参数理解(跑pytorch代码时遇到的问题)
在訓練和測試的時候遇到的問題,
_error_if_any_worker_fails()
RuntimeError: DataLoader worker (pid 25637) is killed by signal: Killed.
?
以及,
RuntimeError: $ Torch: not enough memory: you tried to allocate
經過研究,修改batch_size參數就不報錯了。將batch_size改小一點,甚至是1都可以。
(PS:也許是我電腦真的不行,改成1了還是跑不動,準備申請一臺好一點的電腦)
?
batch size 參數
批尺寸Batch_Size為每次訓練樣本個數;
迭代次數=樣本總數/批尺寸;
https://www.zhihu.com/question/32673260
在合理范圍內,增大 Batch_Size 有何好處?
- 內存利用率提高了,大矩陣乘法的并行化效率提高
- 跑完一次epoch(全數據集)所需要的迭代次數減小,對于相同數據量的處理速度進一步加快
- 在一定范圍內,一般來說batch size越大,其確定的下降方向越準,引起的訓練震蕩越小
盲目增大batch size 有什么壞處
- 內存利用率提高了,但是內存容量可能撐不住了
- 跑完一次epoch(全數據集)所需要的迭代次數減少,但是想要達到相同的精度,其所花費的時間大大增加了,從而對參數的修正也就顯得更加緩慢
- batch size 大到一定的程度,其確定的下降方向已經基本不再變化
fine tuning
http://bealin.github.io/2016/10/23/Caffe%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%97%E2%80%94%E2%80%943Fine-tuning%E5%BE%AE%E8%B0%83%E7%BD%91%E7%BB%9C/
fine tuning 流程
- 準備數據集(包括訓練數據和測試數據)
- 計算數據集的均值文件,因為某個特定領域的圖像均值文件會跟ImageNet上的數據均值不太一樣
- 修改網絡最后一層的輸出類別數,以及最后一層網絡的名稱,加大最后一層的參數學習速率
- 調整solver的配置參數
- 加載預訓練模型的參數,啟動訓練
fine tuning 參數調整
一般fine tuning的方式,都是把learning rate(solver.prototxt)調低(為原來的十分之一),之后把訓練模型的最后一層或者兩層的學習速率調大一點————這就相當于,把模型的前面那些層的學習調低,使得參數更新的慢一點以達到微調的目的。但有可能會導致整個收斂速度變慢,因此還需要增加最大迭代次數。
需要調節的參數(solver.prototxt)主要包括:
base_lr:初始學習率,這個是非常重要的一個參數;momentum:一般設置為0.9,如果base_lr特別低的話也可以設置為0.99或0.999等 weight_decay:默認0.005,可以適當調整,類似于正則化項;
lr_policy:學習率變化策略,常見的有fixed(固定), inv,step等,詳細的說明見http://stackoverflow.com/questions/30033096/what-is-lr-policy-in-caffe
最后如果loss出現不收斂的情況,可以嘗試一下以下幾種方法:
- 調小solver里的初始學習率
- 數據量小的話,可以只對最后幾層的權重進行調整,前面權重保持不變,即把前面的學習率置為0,一定程度上限制了激活的大小,這樣就限制了某一過大的誤差的影響,這樣可以避免迭代方向出現過大的變化。
- 在GPU可承受的范圍內調大batch_size的大小(賈揚清的解釋:理論上batch小是不會影響收斂的。小batch主要的問題是在FC層的計算可能會不是很efficient,如果實在無計可施,可以試試 ;網上其他博主的解釋:batch比較小 ,導致樣本覆蓋面過低,產生了非常多的局部極小點,在步長和方向的共同作用下,導致數據產生了震蕩,導致了不收斂 )
總結
以上是生活随笔為你收集整理的深度学习中的 Batch_Size,以及learning rate参数理解(跑pytorch代码时遇到的问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CESM2笔记——porting-新机器
- 下一篇: Linux守护进程设计规范及python