交叉熵是 nan

cli*_*ner 1 python conv-neural-network tensorflow cross-entropy

我正在部署我的 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)
Run Code Online (Sandbox Code Playgroud)

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

如果我打印 train_step 它将显示无。谁能帮我?

mda*_*ust 6

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

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

这有两个问题。

第一:它可以大于一个。

第二:

它可以正好为零(任何输入ReLU4为负的地方,它的输出都将为零)。

log(0) -> NaN

通常的方法是将线性激活(无 ReLU)视为每个类的对数几率。

天真的实现总是被破坏(数字问题)。

由于您只有一个类,因此您应该使用tf.sigmoid_cross_entropy_with_logits


对于返回的训练操作None:操作和张量之间存在微妙的区别。尝试print(train_step)print(cross_entropy)

评估一个 op 会做一些事情,而评估一个张量会给你一个价值。因此,如果您正在寻找在前向传递中计算的交叉熵的值,请执行以下操作_, loss_value = sess.run([train_step, cross_entropy])