我有以下代码
pred_raw = create_feedforward_nn_model(x, weights, biases)
pred = tf.round(tf.nn.sigmoid(pred_raw))
cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=pred, logits=y))
train_op = tf.train.AdamOptimizer(learning_rate).minimize(cost)
这里,create_feedforward_nn_model
只需创建一个2层前馈DNN并返回最后一层(logits)。所以,当我运行这段代码时,我得到了以下错误
所以,我反复研究发现tf.round
导致了这个问题,因为当我运行它时,更改了下面的行
pred = tf.round(tf.nn.sigmoid(pred_raw))
到
pred = tf.nn.sigmoid(pred_raw)
它工作正常。在
tf.round
不应该也支持渐变吗?我是不是少了点什么?在
我使用的是Tensorflow 1.4版
round
没有梯度,因为函数是分段常量且非连续的。也就是说,对于结果相同的任何范围(例如范围(0.5, 1.5)
),梯度将为0,并且在边界值(0.5、1.5等)处是未定义的。在任何情况下,0的渐变都是没有用的。在我想你在代码中混了些东西。在二进制分类中,您确实希望在最后输出类(即0或1),但是为了进行培训,您通常希望使用连续概率。也就是说,在没有舍入的情况下,sigmoid输出。除此之外,内置的张量流交叉熵损失实际上在内部应用了sigmoid,并期望有前sigmoid值(logits),这是由它们的名称所暗示的(例如
tf.nn.sigmoid_cross_entropy_with_logits
)。所以在你的片段中,你应该把logits = pred_raw
传递给损失。在顺便说一句,你还混淆了}
labels
和{logits
是你的模型输出,labels
是真正的标签。在相关问题 更多 >
编程相关推荐