天天看點

tensorflow訓練時 loss在某個batch變為nan

1. 查找資料,訓練資料或标簽是否有nan

最好先做這部篩查,不然白費功夫。說來慚愧,試了如下N種政策,還是有nan,于是開始查找資料的問題,果然有一波資料中有nan的值。

import numpy as np

if (np.any(np.isnan(items))):

       print(items)

#把nan的值變為0,其餘不變

items = np.nan_to_num(items)

處理nan的資料因人而異,也可将髒資料舍棄。還看到有大兄弟把bachsize設為1來找資料的問題,emmm,直接在資料處理時做比較省事吧。

2.  對資料做歸一化處理 (這個訓練網絡一般都會做吧)

3. 減國小習率,減小batchsize。(傳說網絡層數越深,學習率應該越小)

4. log(0)導緻梯度爆炸

使用梯度裁剪,計算損失函數的過程中遇到的log的地方都加clip

tf.log(tf.clip_by_value(tf.sigmoid(self.scores),1e-8,1.0)

常見于分類網絡,注意交叉熵損失

5. 每一層都用BN

6.調整網絡結構,增加寬度(特征數量)

reference:

https://blog.csdn.net/qq_33485434/article/details/80733251

https://blog.csdn.net/accumulate_zhang/article/details/79890624

https://www.jianshu.com/p/79ea75c47004

https://blog.csdn.net/shwan_ma/article/details/80472996

繼續閱讀