我有以下代码
{
"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版
答案 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_raw
和labels
-logits
是模型输出,logits
是真实标签。