tensorflow的tf.round()导致值错误,因为它是没有梯度的操作

时间:2018-07-23 07:08:55

标签: python tensorflow

我有以下代码

{
"name":"test",
address{
"localAddress":"myaddress",
"businessAddress":"testAddress"
}
}

在这里, 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) 仅创建2层前馈DNN并返回最后一层(即logits)。因此,当我运行此代码时,出现以下错误,

create_feedforward_nn_model

因此,我玩转,发现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

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

工作正常。

pred = tf.nn.sigmoid(pred_raw) 也应该不支持渐变吗?我在这里想念东西吗?

我正在使用 Tensorflow 1.4版

1 个答案:

答案 0 :(得分:1)

您认为round的梯度应该是什么?该函数是分段恒定且非连续的。也就是说,对于结果相同的任何范围(例如,范围(0.5, 1.5)),梯度将为0,并且在边界值(0.5、1.5等)处将是未定义的。无论如何,这将导致完全无用的梯度(梯度为0表示没有学习)。

我认为您在代码中混入了一些东西。在二进制分类中,您确实希望类输出在末尾(即0或1),但是对于训练而言,通常将需要使用连续概率。也就是说,S形输出没有舍入。除此之外,内置的Tensorflow交叉熵损失实际上在内部应用了S形,并期望 pre-Sigmoid 值(logits),这由其名称隐含(例如{{1} }。因此,在摘要中,您应该将tf.nn.sigmoid_cross_entropy_with_logits传递给损失。

顺便说一句,您还混合了logits = pred_rawlabels-logits是模型输出,logits是真实标签。