2016-10-22 109 views
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]。标签矩阵的值为{0,1},这是一个两类密集预测。

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

回答

2

你很好地把问题缩小到了几行代码。

那么你的预测概率是直接输出的ReLU4

有两个问题。

首先:它可以大于1。

二:

它可以精确为零(任何地方输入到ReLU4为负,其结果将是零)。

log(0) -> NaN

通常的方法此是治疗线性激活(否RELU)作为每个类的对数比值。

一个天真的实现总是被打破(数值问题)。

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


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

评估一个操作会做些什么,而评估一个张量会给你一个值。因此,如果您正在寻找正向传递计算的交叉熵值,只需执行如下操作:_, loss_value = sess.run([train_step, cross_entropy])

+0

感谢@ mdaoust为我指出了我的错误! 对于你的第一个问题,是的,预测的概率是relu4的输出。 所以在diogram中,loss = cross_etropy。 我忘了Relu操作后会有很多的零。 现在我用cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(prediction,ys_reshape)替换第三行 但我的train_step输出仍然是None。所以我认为这层中的错误是固定的,但其他层中还有一些错误。非常感谢你! – clickListener

+0

@clickListener查看编辑 – mdaoust

+0

是的,我想观察每次前锋传球后的cross_entropy矩阵,它终于工作!我使用这个命令:_,loss_value = sess.run([train_step,cross_entropy],feed_dict = {xs:batch_xs,ys:batch_ys})。 谢谢你,你是最好的!非常感谢!但我仍然有点困惑,为什么print(train_step)的输出是None?!在我看来,它应该显示像张量对象或张量类而不是无。但最重要的是你解决了我的问题〜 – clickListener