tensorflow的值错误tf.圆形()因为这是一个没有梯度的手术

2024-06-16 13:49:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码

    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)。所以,当我运行这段代码时,我得到了以下错误

^{pr2}$

所以,我反复研究发现tf.round导致了这个问题,因为当我运行它时,更改了下面的行

pred = tf.round(tf.nn.sigmoid(pred_raw))

pred = tf.nn.sigmoid(pred_raw)

它工作正常。在

tf.round不应该也支持渐变吗?我是不是少了点什么?在

我使用的是Tensorflow 1.4版


Tags: 代码rawmodeltfcreatetrainnncost
1条回答
网友
1楼 · 发布于 2024-06-16 13:49:15

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是真正的标签。在

相关问题 更多 >