最近使用tf2.0的keras訓(xùn)練模型時诺凡,loss在訓(xùn)練一段時間后就變成了nan东揣,此時雖然acc卻還在一直上升,但是訓(xùn)練完幾個epoch之后模型并沒有保存下來腹泌,所以nan這個問題還是得解決嘶卧。
可能有幾個原因:
- 梯度爆炸了,這個時候直接導(dǎo)致每次的梯度越來越大凉袱,loss也隨之變成nan脸候,解決方法是使用梯度裁剪
- 學(xué)習(xí)率過大,此時降低學(xué)習(xí)率即可绑蔫。
- 樣本中有臟數(shù)據(jù),導(dǎo)致求得的logits為0泵额,使用交叉熵損失時計算log(0)導(dǎo)致nan配深,此時去掉臟數(shù)據(jù)。
對于前兩種方式嫁盲,代碼如下:
最開始設(shè)置model.compile
時篓叶,可以直接這么寫:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
要修改默認learning_rate和加上梯度裁剪:
adam = tf.keras.optimizers.Adam(lr=config.learning_rate, clipnorm=1)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
此時我的問題就解決了~