Python tensorflow'的值错误;s tf.round()原样';这是一个没有梯度的操作

Python tensorflow'的值错误;s tf.round()原样';这是一个没有梯度的操作,python,tensorflow,Python,Tensorflow,我有以下代码 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(learnin

我有以下代码

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

ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables 
["<tf.Variable 'Variable:0' shape=(28, 20) dtype=float32_ref>", "<tf.Variable 'Variable_1:0' shape=(20, 8) dtype=float32_ref>", "<tf.Variable 'Variable_2:0' shape=(8, 1) dtype=float32_ref>", "<tf.Variable 'Variable_3:0' shape=(20,) dtype=float32_ref>", "<tf.Variable 'Variable_4:0' shape=(8,) dtype=float32_ref>", "<tf.Variable 'Variable_5:0' shape=(1,) dtype=float32_ref>"] 
and loss Tensor("Mean_8:0", shape=(), dtype=float32).

它工作正常

不应该
tf.round
也支持渐变吗?我是不是遗漏了什么


我使用的是Tensorflow 1.4版

由于函数是分段常数和非连续的,所以圆函数没有梯度。也就是说,对于结果相同的任何范围(例如范围
(0.5,1.5)
),梯度将为0,并且在边界值(0.5,1.5等)处未定义梯度。在任何情况下,0的渐变都是无用的

我认为您在代码中混入了一些内容。在二进制分类中,您确实希望在结尾处有类输出(即0或1),但对于训练,您通常希望使用连续概率。也就是说,sigmoid输出没有舍入。除此之外,内置的Tensorflow交叉熵损失实际上在内部应用了sigmoid,并预期了前sigmoid值(logits),这是由它们的名称所暗示的(例如
tf.nn.sigmoid\u交叉熵\u和\u logits
)。因此,在代码片段中,您应该将
logits=pred_raw
传递给loss

顺便说一句,您还混淆了
标签
登录
-
登录
是您的模型输出,
标签
是真正的标签

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