我有一个基于AlexNet的用于年龄分类的网络。当我训练8个类别的网络时,一切正常,但当我将类别增加到60或100时,我得到了“模型在损失值为NaN时出现分歧”的错误。我已经将学习率降低到0.00000001甚至0.0,并将批量大小减少到1,但这些都没有帮助。
我的损失函数是:
def loss(logits, labels): labels = tf.cast(labels, tf.int32) #trying to avoig log(0) shape = [logits.get_shape()[0], 57] epsilon = tf.constant(value=0.1, shape=shape) logits = logits + epsilon cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits( logits= logits,labels= labels, name='cross_entropy_per_example') cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy',) tf.add_to_collection('losses', cross_entropy_mean) losses = tf.get_collection('losses') regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) total_loss = cross_entropy_mean + LAMBDA * sum(regularization_losses) tf.summary.scalar('tl (raw)', total_loss) #total_loss = tf.add_n(losses + regularization_losses, name='total_loss') loss_averages = tf.train.ExponentialMovingAverage(0.9, name='avg') loss_averages_op = loss_averages.apply(losses + [total_loss]) for l in losses + [total_loss]: tf.summary.scalar(l.op.name + ' (raw)', l) tf.summary.scalar(l.op.name, loss_averages.average(l)) with tf.control_dependencies([loss_averages_op]): total_loss = tf.identity(total_loss) return total_loss
有什么解决这个问题的想法吗?
回答:
另一个可能的尝试是更改权重的初始化,有时降低幅度可能会有所帮助。你还可以考虑使用add_check_numeric_ops
来调试NaN的确切来源,如下例所示:调试反向传播中的NaN