【问题标题】:cross entropy is nan交叉熵是nan
【发布时间】:2017-03-04 17:08:41
【问题描述】:

我正在部署我的 conv-deconv 网络。我的问题是交叉熵在训练时总是 nan ,所以求解器没有更新权重。我整天检查我的代码,但我不知道我哪里出错了。以下是我的架构: 这是我的交叉熵函数

ys_reshape = tf.reshape(ys,[-1,1])
prediction = tf.reshape(relu4,[-1,1])
cross_entropy = tf.reduce_mean(-(ys_reshape*tf.log(prediction)))
train_step = tf.train.AdamOptimizer(0.01).minimize(cross_entropy)

其中ys的维度为[1,500,500,1],ys_reshape为[250000,1],relu4为[1,500,500,1],预测为[250000,1]。标签矩阵ys的值为{0,1},是一个二分类密集预测。

如果我打印 train_step out,它将显示 None。谁能帮帮我?

【问题讨论】:

    标签: python tensorflow conv-neural-network cross-entropy


    【解决方案1】:

    您在将问题缩小到正确的几行代码方面做得很好。

    所以你的预测概率直接是ReLU4的输出?

    这样做有两个问题。

    第一:它可以大于一。

    第二:

    它可以完全为零(ReLU4 的任何输入为负,它的输出都为零)。

    log(0) -> NaN

    解决这个问题的常用方法是将线性激活 (No ReLU) 视为每个类的对数几率。

    一个简单的实现总是被破坏(数字问题)。

    因为你只有一个类,你应该使用tf.sigmoid_cross_entropy_with_logits


    对于返回 None 的训练操作:这里有一个微妙的区别,操作和张量之间。试试print(train_step)print(cross_entropy)

    评估一个操作会做一些事情,而评估一个张量会得到一个值。因此,如果您正在寻找在前向传播中计算的交叉熵的值,只需执行类似 _, loss_value = sess.run([train_step, cross_entropy])

    的操作

    【讨论】:

    • 感谢@mdaoust 指出我的错误!对于您的第一个问题,是的,预测概率是 relu4 的输出。所以在对偶图中,loss=cross_etropy。我忘了relu操作后会有很多零。现在我用 cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(prediction,ys_reshape) 替换第三行但是我的 train_step 输出仍然是 None。所以我认为这一层的错误是固定的,但其他层还有一些错误。非常感谢你!
    • 是的,我想在每次前向传递后观察 cross_entropy 矩阵,它终于起作用了!!我使用这个命令:_, loss_value = sess.run([train_step, cross_entropy],feed_dict={xs:batch_xs, ys:batch_ys})。谢谢你,你是最棒的!!非常感谢你!!!但是我仍然有点困惑,为什么 print(train_step) 的输出是 None?!在我看来,它应该显示诸如张量对象或张量类之类的东西,而不是无。不过最重要的是你解决了我的问题~
    猜你喜欢
    • 2019-03-23
    • 1970-01-01
    • 2019-07-13
    • 2020-01-03
    • 2017-06-18
    • 2021-08-25
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多