【问题标题】:Why tf.gradient with tf.where returns None?为什么 tf.gradient 和 tf.where 返回 None?
【发布时间】:2019-08-27 15:07:41
【问题描述】:

我想根据某些条件更改输入或/和输出。但毕业生是无。

我怎样才能得到渐变并像下面的代码一样保持选择?

input1, input2 = ..., ...
output1, output2 = model(input1), model(input2)

input = tf.where(tf.less(output1, output2), input1, input2)
output = tf.where(tf.less(output1, output2), output1, output2)

grad, = tf.gradient(output, input)

我打印输入和输出的类型,它们的尺寸与输入1/输出1(输入2/输出2)相同。而如果我只计算 tf.gradient(output1,input1) 也没问题。它们有什么区别?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    你可以这样做:

    input1, input2 = ..., ...
    output1, output2 = model(input1), model(input2)
    mask = tf.less(output1, output2)
    input = tf.where(mask, input1, input2)
    output = tf.where(mask, output1, output2)
    grad = tf.add(*tf.gradients(output, [input1, input2]))
    

    tf.gradient 将在未选择相应输入的位置返回两个带有零的张量。因此,grad 将为input 保存正确的聚合梯度。

    您的原始方法不起作用,因为从 TensorFlow 的角度来看,inputoutput 之间没有依赖关系。 input 是从input1input2 计算出来的,output 也是从input1input2 计算出来的,但是图中没有从inputoutput 的路径,所以没有渐变。

    【讨论】:

    • 感谢您提供如此明确的答案!但是在我添加grad = tf.add(*tf.gradients(output, [input1, input2])) 之后,它会显示ValueError: Tried to convert 'y' to a tensor and failed. Error: None values not supported.。然后我打印tf.gradients(output, [input1, input2]),我发现其中之一是无。可能是什么问题,我该如何解决?
    • @hjw 这很奇怪,我用一个简单的model 函数(如多项式)测试了上面的代码并且它工作正常。可能是你在model 中有一些不可微分的函数,但奇怪的是它与input1 一起工作而不是input2。无论如何,恐怕这个问题一定与model的定义有关。
    • model 函数是一个普通的神经网络。我冻结权重并循环model(input1), model(input11), model(input111).... 几次。更具体地说,input1/output1 代表输入图像及其 logits,而 input2 和 output2 是我从历史中选择的最优值(成对选择)。这是问题的核心吗?
    • @hjw 嗯我真的不知道,如果你用一些琐碎的东西定义model,你能检查一下上面的sn-p是否适合你吗?例如。 model = lambda x: 3 * x ** 2 -2 * x + 1.
    【解决方案2】:

    如果有人仍然坚持使用 NaN 输入,tf.where 可以完全替换为:

    tf.minimum(tensor_having_nans, value_that_replaces_nans)
    

    另外,tf.maximum 有效,并且渐变不会截断。 如果是“inf”,则只有 tf.minimum 有效

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 2018-11-29
      • 2015-06-18
      相关资源
      最近更新 更多