'Model diverged with loss = NaN' ,当 类 的数量增加时,即使学习率很小。 [张量流]
'Model diverged with loss = NaN' , when number of classes increases even with small learning rate . [tensorflow]
我有一个基于 alexnet 的年龄分类网络。
当我为 8 类 训练网络时,它工作得很好,但是当我将 类 增加到 60 或 100 时,我得到“'Model dverged with loss = NaN”
我已经将学习率降低到 0.00000001 或什至 0.0,并将浴缸大小降低到 1 even 。但没有帮助。
我的损失函数是:
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 的来源,如本例所示:
看起来您正在处理一个不平衡的数据集,并且当批次中没有 类 时您添加了一个小值,对吗?
我在您发布的代码中没有看到任何权重,据我所知,使用 类 的权重向 logits 添加一个小常量是有意义的。无论如何假设其余的是正确的,也许值 0.1 相对太大并且可能导致不稳定。尝试使用非常非常小的一个,例如 1e-8。您也可以只添加一个以元素方式添加到整个 logits 张量的常量,如下所示:
epsilon = tf.constant(1e-8)
logits = logits + epsilon
我有一个基于 alexnet 的年龄分类网络。 当我为 8 类 训练网络时,它工作得很好,但是当我将 类 增加到 60 或 100 时,我得到“'Model dverged with loss = NaN” 我已经将学习率降低到 0.00000001 或什至 0.0,并将浴缸大小降低到 1 even 。但没有帮助。
我的损失函数是:
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 的来源,如本例所示:
看起来您正在处理一个不平衡的数据集,并且当批次中没有 类 时您添加了一个小值,对吗? 我在您发布的代码中没有看到任何权重,据我所知,使用 类 的权重向 logits 添加一个小常量是有意义的。无论如何假设其余的是正确的,也许值 0.1 相对太大并且可能导致不稳定。尝试使用非常非常小的一个,例如 1e-8。您也可以只添加一个以元素方式添加到整个 logits 张量的常量,如下所示:
epsilon = tf.constant(1e-8)
logits = logits + epsilon