原因1:梯度爆炸
产生原因:学习率过大。
解决方法:
3. 数据归一化(减均值,除方差,或者加入normalization:BN,L2 norm等)。
4. 更换参数初始化方法(对于CNN,一般用xavier或者msra的初始化方法)。
5. 减小学习率,减小Batch size。
6. 加入梯度截断(gradient clipping)。
原因2:网络结构设计问题
解决方法:
- 加如BN层进行归一化。
- 修改网络结构(如增加网络宽度、增加网络层数)。
- 改变层的学习率,每个层都可以设置学习率,可以尝试减小后面层的学习率。
原因3: 不同框架迁移时的代码问题
解决方法:
- debug不同框架下产生的代码错误。
- 不同框架下的函数意义不同,需要准确迁移。
原因4: 数据集的问题
1.可能数据集中存在脏数据。从而导致无法训练的问题。
解决方法:
通过设置batch_size = 1,shuffle = False,一步一步地将sample定位到了所有可能的脏数据,并且删掉。
2.可能是数据集label数量和模型中设置的label数量不一致。
原因5:损失函数设置问题
例子:
在TensorFlow中,如果使用交叉熵:cross_entry = -tf.reduce_sum(tf.log(y_conv))的话,最后softmax输出层的y_conv取值范围在[0,1]中是允许取0的,但是log(0)很有可能会导致NaN的出现。
所以在设置损失函数时要注意细节。