所以我有一行代码:
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特有的问题...在这里很困惑。
谢谢
答案 0 :(得分:3)
这里发生的是修饰pack_padded_sequence
以返回部分应用的函数,并且在修饰代码中有一个函数接受*args, **kwargs
作为参数。此函数将args
传递给另一个函数,该函数检查第一个arg
。当您将所有参数作为关键字参数传递给packed_padded_sequence
时,args
为空,因此args[0]
引发IndexError
。如果将input
作为位置参数传递,则args
不为空,并且不会引发IndexError
。
此示例代码演示了该行为(Pytorch code不容易阅读)。
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)