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: