Python tf.具有多个输入的自定义_梯度
只接受一个张量Python tf.具有多个输入的自定义_梯度,python,tensorflow,Python,Tensorflow,只接受一个张量x,如果此op需要多个输入怎么办 例如,要定义Softmax的渐变,需要输入x和label 更新 感谢@AllenLavoie的建议,我使用Python列表作为输入 def self_define_op_multiple_inputs(): @tf.custom_gradient def loss_func(input_): x = input_[0] label = input_[2] def grad(dy):
x
,如果此op需要多个输入怎么办
例如,要定义Softmax的渐变,需要输入x
和label
更新
感谢@AllenLavoie的建议,我使用Python列表作为输入
def self_define_op_multiple_inputs():
@tf.custom_gradient
def loss_func(input_):
x = input_[0]
label = input_[2]
def grad(dy):
return [dy, dy]
return x - label, grad
x = tf.range(10, dtype=tf.float32)
y = tf.range(10, dtype=tf.int32)
loss = loss_func([x, y])
if __name__ == '__main__':
self_define_op_multiple_inputs()
它似乎会将Python的列表
转换为张量
。上面的代码段将引发类型错误
:
TypeError:无法将包含dtype张量的列表转换为(张量为:)
如何修复它?我相信您需要这样的tf图形输入:+ n_input是输入编号
x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None])
这是否回答了您的问题?我相信您需要这样的tf图形输入:+ n_input是输入编号
x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None])
这回答了你的问题吗?我昨天遇到了类似的问题,找到了这篇文章,我相信我知道你遇到了什么。问题是,当使用@tf.custom_gradient时,它修饰的函数可以有多个输入(而不是张量列表)。看看下面的代码(请注意,这只是一个没有实际意义的测试代码): 通过使用两个输入x和a,您必须在梯度函数中分别返回两个梯度。dy*3对应于x的梯度,dy*2对应于a的梯度
我认为在这个函数中,文档会让人非常困惑,但是你仍然可以使用多个输入,只要确保你也有相同数量的渐变,否则你会遇到错误。我昨天遇到了类似的问题,找到了这篇文章,我相信我知道你遇到了什么。问题是,当使用@tf.custom_gradient时,它修饰的函数可以有多个输入(而不是张量列表)。看看下面的代码(请注意,这只是一个没有实际意义的测试代码): 通过使用两个输入x和a,您必须在梯度函数中分别返回两个梯度。dy*3对应于x的梯度,dy*2对应于a的梯度
我认为在这个函数中,文档会让人非常困惑,但是您仍然可以使用多个输入,只需确保您也有相同数量的渐变,否则您将遇到错误。谢谢您的帮助。但你似乎不明白我在说什么<代码>tf。自定义梯度不是计算图。您可以阅读文档了解更多详细信息。谢谢您的帮助。但你似乎不明白我在说什么<代码>tf。自定义梯度不是计算图。您可以阅读文档了解更多详细信息。文档中说
x
和y
都可以是张量或张量序列。这对你不管用吗?@AllenLavoie实际上这正是让我困惑的地方。我不明白什么是张量序列,它是指张量的Pythonlist
?我的解释是Pythonlist
(或者tuple
,等等)。因此len(x)
是操作的输入数量,len(y)
是输出数量。然后梯度函数取len(y)
Tensor
参数并返回len(x)
Tensor
s.@AllenLavoie我试图使用list
,但似乎list
将转换为Tensor
,如果有多个不同类型和匹配形状的输入,将导致错误。问题已经更新。@AllenLavoie我在文档中创建了一个问题,即x
和y
都可以是张量或张量序列。这对你不管用吗?@AllenLavoie实际上这正是让我困惑的地方。我不明白什么是张量序列,它是指张量的Pythonlist
?我的解释是Pythonlist
(或者tuple
,等等)。因此len(x)
是操作的输入数量,len(y)
是输出数量。然后梯度函数取len(y)
Tensor
参数并返回len(x)
Tensor
s.@AllenLavoie我试图使用list
,但似乎list
将转换为Tensor
,如果有多个不同类型和匹配形状的输入,将导致错误。问题已更新。@AllenLavoie我在上创建了一个问题