首页 > 解决方案 > “输入”是用作参数名称(在 PyTorch 中)时导致错误的关键字吗?

问题描述

所以我有一行代码:

packed_embeddings = pack_padded_sequence(input=embeddings,
                                                 lengths=lengths,
                                                 batch_first=True)

这向我抛出了这个错误:

  File "/Users/kwj/anaconda3/lib/python3.6/site-packages/torch/onnx/__init__.py", line 130, in might_trace
    first_arg = args[0]

IndexError: tuple index out of range

但是如果我取出“输入”,它会神奇地自我修复:

    packed_embeddings = pack_padded_sequence(embeddings,
                                             lengths=lengths,
                                             batch_first=True)

这是 PyTorch 文档中的函数规范:

https://pytorch.org/docs/stable/_modules/torch/nn/utils/rnn.html#pack_padded_sequence

我正在使用 Python3 和 PyTorch 0.4。我错过了一些非常基本的东西吗?不确定这是我的问题,还是 PyTorch 的特定问题……这里很困惑。

谢谢

标签: pythonpytorch

解决方案


这里发生的是pack_padded_sequence被修饰为返回一个部分应用的函数,并且在修饰代码中有一个函数接受参数为*args, **kwargs. 该函数传递args给另一个函数,该函数检查第一个arg. 当您将所有参数packed_padded_sequence作为关键字参数传递给时,args它是空的,因此args[0]会引发IndexError. 如果您input作为位置参数传递,args则不是空的,并且IndexError不会引发。

此示例代码演示了该行为(Pytorch代码不易阅读)。

def decorator(func):
    def wrapper(*args, **kwargs):
        print('Args:', repr(args))
        print('Kwargs:', repr(kwargs))
        return func(*args, **kwargs)
    return wrapper   

@decorator
def f(a, b=0, c=0):
    return a, b, c


if __name__ == '__main__':
    print('Positional argument...')
    print(f(1, b=2, c=3))
    print('All keyword arguments...')
    print(f(a=1, b=2, c=3))

该代码产生以下输出:

Positional argument...
Args: (1,)                        <- Args is populated
Kwargs: {'b': 2, 'c': 3}
(1, 2, 3)
All keyword arguments...
Args: ()                          <- Args is empty
Kwargs: {'a': 1, 'b': 2, 'c': 3}
(1, 2, 3)

推荐阅读