代码之家  ›  专栏  ›  技术社区  ›  rawwar

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

  •  1
  • rawwar  · 技术社区  · 6 年前

    我有以下代码

        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 引起这个问题的原因是,当我运行它时更改了下面的行

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

    pred = tf.nn.sigmoid(pred_raw)
    

    工作正常。

    不应该 转台 也支持梯度我是不是丢了什么东西?

    我在用 Tensorflow版本1.4

    1 回复  |  直到 6 年前
        1
  •  2
  •   Epsilon1024 xdurch0    6 年前

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

    我认为你在代码中混合了一些东西。在二进制分类中,您确实希望在结尾处有类输出(即0或1),但是对于训练,您通常希望使用连续概率也就是说,乙状结肠输出 没有 四舍五入除此之外,内置的Tensorflow交叉熵损失实际上应用于乙状结肠内部,并期望 乙状结肠前 值(logits),由其名称表示的sorta(例如。 tf.nn.sigmoid_cross_entropy_with_logits ). 所以在你的片段中你应该通过 logits = pred_raw 为了损失。

    顺便说一句,你也搞混了 labels logits -- 登录 是你的模型输出, 标签 真正的标签。