我正在部署我的conv-deconv网。我的问题是交叉熵在训练时总是很好,所以解算器没有更新权重。我整天检查了我的代码,但我不知道哪里出错了。以下是我的架构: 这是我的交叉熵函数
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。任何人都可以帮助我吗?
答案 0 :(得分:2)
你把问题缩小到正确的几行代码做得很好。
所以你的预测概率直接是ReLU4
的输出?
这有两个问题。
首先:它可能大于一个。
第二
它可以正好为零(ReLU4
的输入为负的任何地方,它的输出将为零)。
log(0) -> NaN
通常的做法是将线性激活(No ReLU)视为每个类别的对数概率。
天真的实现总是被打破(数字问题)。
由于您只有一个班级,因此您应该使用tf.sigmoid_cross_entropy_with_logits
对于训练操作返回None
:这里有一个微妙的区别,在操作和张量之间。试试print(train_step)
和print(cross_entropy)
。
评估op会做一些事情,而评估张量会获得一个值。因此,如果您正在寻找在前向传球上计算的交叉熵的值,请执行_, loss_value = sess.run([train_step, cross_entropy])