我正在部署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的维数为[1500500,1],ys_的形状为[250000,1],relu4为[1500500,1],预测为[250000,1]。标签矩阵y的值为{0,1},是一个两类稠密预测。
如果我打印train_step out,它将显示None。有人能帮我吗?
你把问题缩小到正确的几行代码上做得很好。
所以你预测的概率就是
ReLU4
的输出?这有两个问题。
第一:可以大于一。
第二:
它可以精确地为零(只要
ReLU4
的输入为负,它的输出就为零)。log(0) -> NaN
通常的方法是将线性激活(无ReLU)视为每个类的对数概率。
天真的实现总是被破坏的(数字问题)。
因为只有一个类,所以应该使用tf.sigmoid_cross_entropy_with_logits
对于训练op返回
None
:这里有一个微妙的区别,ops和tensor。尝试print(train_step)
和print(cross_entropy)
。计算一个op可以做一些事情,而计算一个张量可以得到一个值。所以如果你在寻找前向过程中计算的交叉熵的值,就做一些类似
_, loss_value = sess.run([train_step, cross_entropy])
的事情相关问题 更多 >
编程相关推荐