最近使用tf2.0的keras训练模型时,loss在训练一段时间后就变成了nan,此时虽然acc却还在一直上升,但是训练完几个epoch之后模型并没有保存下来,所以nan这个问题还是得解决。
可能有几个原因:
- 梯度爆炸了,这个时候直接导致每次的梯度越来越大,loss也随之变成nan,解决方法是使用梯度裁剪
- 学习率过大,此时降低学习率即可。
- 样本中有脏数据,导致求得的logits为0,使用交叉熵损失时计算log(0)导致nan,此时去掉脏数据。
对于前两种方式,代码如下:
最开始设置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'])
此时我的问题就解决了~