1

我正在部署我的 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。谁能帮我?

4

1 回答 1

6

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

所以你的预测概率直接是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])

于 2016-10-22T15:31:31.340 回答