交叉熵是南

cross entropy is nan

我正在部署我的 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,它会显示 None。谁能帮帮我?

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

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

这有两个问题。

第一:可以大于一

第二个:

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

log(0) -> NaN

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

天真的实现总是会出错(数值问题)。

既然你有一个class,你应该使用tf.sigmoid_cross_entropy_with_logits


对于返回的训练运算 None:运算和张量之间存在细微差别。试试 print(train_step)print(cross_entropy)

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