cli*_*ner 1 python conv-neural-network tensorflow cross-entropy
我正在部署我的 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)
Run Code Online (Sandbox Code Playgroud)
其中 ys 的维度为 [1,500,500,1],ys_reshape 为 [250000,1],relu4 为 [1,500,500,1],预测为 [250000,1]。标签矩阵ys的值是{0,1},这是一个两类密集预测。
如果我打印 train_step 它将显示无。谁能帮我?
您在将问题缩小到正确的几行代码方面做得很好。
所以你的预测概率直接是ReLU4?
这有两个问题。
第一:它可以大于一个。
第二:
它可以正好为零(任何输入ReLU4为负的地方,它的输出都将为零)。
log(0) -> NaN
通常的方法是将线性激活(无 ReLU)视为每个类的对数几率。
天真的实现总是被破坏(数字问题)。
由于您只有一个类,因此您应该使用tf.sigmoid_cross_entropy_with_logits
对于返回的训练操作None:操作和张量之间存在微妙的区别。尝试print(train_step)和print(cross_entropy)。
评估一个 op 会做一些事情,而评估一个张量会给你一个价值。因此,如果您正在寻找在前向传递中计算的交叉熵的值,请执行以下操作_, loss_value = sess.run([train_step, cross_entropy])
| 归档时间: |
|
| 查看次数: |
10238 次 |
| 最近记录: |