之前訓練網路時,會先編寫學習率隨訓練epoch的增加而逐漸減低的函式,然後選取一個相對較大的學習率(一般從e-2量級開始),選取一個epoch能夠接受的batchsize,如果loss穩定下降較快,則開始訓練。從未體驗過學習率和batchsize搭配之難。

最近新看了一篇論文ABCNN(有空再細講),採用開源的tensorflow工程訓練一下,效果很好,因工程需要,開始將其移植到pytorch框架下,移植完畢後,關於loss函式遇到不少問題,在此記錄。

1。學習率隨epoch降低的函式

def

adjust_learning_rate

learning_rate

learning_rate_decay

optimizer

epoch

):

“”“Sets the learning rate to the initial LR multiplied by learning_rate_decay(set 0。98, usually) every epoch”“”

learning_rate

=

learning_rate

*

learning_rate_decay

**

epoch

for

param_group

in

optimizer

param_groups

param_group

‘lr’

=

learning_rate

return

learning_rate

2。loss變nan

現象:loss進行一次反傳後,loss變nan;

排查順序:

訓練資料(包括label)中有無異常值(nan, inf等);

網路中有無除法,確保分母不會出現0, 分母可以加一個eps=1e-8;

網路中有無開根號(torch。sqrt), 保證根號下>=0, 我的程式即是由此引起的(未保證不出現0或者極小正值的情況),解決也是加一個eps=1e-8。

3。loss不收斂

此處包含兩種情況,一種是loss一直在震盪,一種是loss下降一點後不再下降到理想水平,而驗證集上的表現保持不變。

1。保持需要的batchsize不變;

2。檢視是否有梯度回傳,檢視程式碼如下:

for name, parms in model。named_parameters():

print(‘——>name:’, name, ‘——>grad_requirs:’, parms。requires_grad, ‘——weight’, torch。mean(parms。data), ‘ ——>grad_value:’, torch。mean(parms。grad))

3。檢視資料是否有問題,如標籤錯亂等現象;

4。調節學習率,從大向小調,建議每次除以5;我的專案即是因為學習率過大過小都不收斂引起的;

5。如果學習率調好後,需要調節batchsize大小,如batchsize調大2倍,則將學習率對應調大(專案測試調大2~3倍OK),反之,學習率對應調小