“模型偏离损失=NaN”,当班级数量增加时,即使学习率很低。[张量流]

2024-04-25 11:37:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基于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

你知道怎么解决这个问题吗?在


Tags: namegetlabelstfmeancollectiontotalentropy
2条回答

看起来你在处理一个不平衡的数据集,而且你在批处理中没有类的情况下添加了一个小值,对吧? 我在您发布的代码中没有看到任何权重,据我所知,在logits中添加一个小常量对类使用权重是有意义的。无论如何,假设其余的都是正确的,可能值0.1相对太大,可能会导致不稳定。试着用一个非常小的,比如1e-8。你也可以只添加一个常量,这个常量是按元素顺序添加到整个logits张量上的,如下所示:

epsilon = tf.constant(1e-8)
logits = logits + epsilon 

另一个可以尝试的方法是更改权重的初始化,有时减小权重的大小会有所帮助。您还可以查看使用add_check_numeric_ops来调试nan的确切来源,如下例所示: Debugging nans in the backward pass

相关问题 更多 >