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实际上这正是让我困惑的地方。我不明白什么是张量序列,它是指张量的Python
list
?我的解释是Python
list
(或者
tuple
,等等)。因此
len(x)
是操作的输入数量,
len(y)
是输出数量。然后梯度函数取
len(y)
Tensor
参数并返回
len(x)
Tensor
s.@AllenLavoie我试图使用
list
,但似乎
list
将转换为
Tensor
,如果有多个不同类型和匹配形状的输入,将导致错误。问题已经更新。@AllenLavoie我在文档中创建了一个问题,即
x
y
都可以是张量或张量序列。这对你不管用吗?@AllenLavoie实际上这正是让我困惑的地方。我不明白什么是张量序列,它是指张量的Python
list
?我的解释是Python
list
(或者
tuple
,等等)。因此
len(x)
是操作的输入数量,
len(y)
是输出数量。然后梯度函数取
len(y)
Tensor
参数并返回
len(x)
Tensor
s.@AllenLavoie我试图使用
list
,但似乎
list
将转换为
Tensor
,如果有多个不同类型和匹配形状的输入,将导致错误。问题已更新。@AllenLavoie我在上创建了一个问题