Python 为什么tf.gradient和tf.where返回None?

Python 为什么tf.gradient和tf.where返回None?,python,tensorflow,Python,Tensorflow,我想根据某些条件更改输入或/和输出。但毕业生一个也没有 我怎样才能得到梯度和保持选择像下面的代码 input1,input2=。。。 output1,output2=模型(input1),模型(input2) 输入=tf.where(tf.less(output1,output2),input1,input2) 输出=tf.where(tf.less(output1,output2),output1,output2) 梯度,=tf.梯度(输出、输入) 我打印输入和输出的类型,它们的尺寸与inp

我想根据某些条件更改输入或/和输出。但毕业生一个也没有

我怎样才能得到梯度和保持选择像下面的代码

input1,input2=。。。
output1,output2=模型(input1),模型(input2)
输入=tf.where(tf.less(output1,output2),input1,input2)
输出=tf.where(tf.less(output1,output2),output1,output2)
梯度,=tf.梯度(输出、输入)
我打印输入和输出的类型,它们的尺寸与input1/output1(input2/output2)相同。如果我只计算tf.gradient(output1,input1),就没有问题了。它们之间有什么区别?

您可以这样做:

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
将为
输入保持正确的聚合梯度

您最初的方法不起作用,因为从TensorFlow的角度来看,
输入
输出
之间没有依赖关系<代码>输入
是从
input1
input2
计算出来的,
output
也是从
input1
input2
计算出来的,但是在图中没有从
输入
输出
的路径,因此没有梯度。

您可以这样做:

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
将为
输入保持正确的聚合梯度


您最初的方法不起作用,因为从TensorFlow的角度来看,
输入
输出
之间没有依赖关系<代码>输入
是从
input1
input2
计算出来的,
output
也是从
input1
input2
计算出来的,但是在图中没有从
输入
输出
的路径,因此没有梯度。

如果有人仍然被输入卡住,tf.where可完全替换为:

tf.最小值(张量有个数,值替换个数)
而且,
tf.maximum
有效,渐变不会截断。
在“inf”的情况下,只有
tf.minimum
起作用

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

tf.最小值(张量有个数,值替换个数)
而且,
tf.maximum
有效,渐变不会截断。
对于“inf”,只有
tf.minimum
起作用

谢谢您如此清晰的回答!但是在我添加
grad=tf.add(*tf.gradients(输出,[input1,input2]))
之后,它说
ValueError:试图将“y”转换为张量,但失败了。错误:不支持任何值。
。然后我打印
tf.gradients(输出,[input1,input2])
,我发现其中一个是None。可能是什么问题?我如何解决它?@hjw这很奇怪,我用一个简单的
模型
函数(像多项式)测试了上面的代码,结果成功了。可能在
模型
中有一些不可微函数,但奇怪的是,它与
input1
一起工作,而与
input2
不一起工作。无论如何,我担心这个问题一定与
model
的定义有关。
model
函数是一个微不足道的神经网络。我冻结权重并循环
model(input1)、model(input11)、model(input111)…
几次。更具体地说,input1/output1代表输入图像及其登录,而input2和output2是我从历史记录中选择的最佳值(成对选择)。这是问题的核心吗?@hjw-Mmm我真的不知道,如果你用一些琐碎的东西定义
model
,你能检查一下上面的代码片段是否适合你吗?例如,
model=lambda x:3*x**2-2*x+1
。感谢您给出如此清晰的答案!但是在我添加
grad=tf.add(*tf.gradients(输出,[input1,input2]))
之后,它说
ValueError:试图将“y”转换为张量,但失败了。错误:不支持任何值。
。然后我打印
tf.gradients(输出,[input1,input2])
,我发现其中一个是None。可能是什么问题?我如何解决它?@hjw这很奇怪,我用一个简单的
模型
函数(像多项式)测试了上面的代码,结果成功了。可能在
模型
中有一些不可微函数,但奇怪的是,它与
input1
一起工作,而与
input2
不一起工作。无论如何,我担心这个问题一定与
model
的定义有关。
model
函数是一个微不足道的神经网络。我冻结权重并循环
model(input1)、model(input11)、model(input111)…
几次。更具体地说,input1/output1代表输入图像及其登录,而input2和output2是我从历史记录中选择的最佳值(成对选择)。这是问题的核心吗?@hjw-Mmm我真的不知道,如果你用一些琐碎的东西定义
model
,你能检查一下上面的代码片段是否适合你吗?例如,
model=lambda x:3*x**2-2*x+1