python - “输入”是用作参数名称(在 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 的特定问题……这里很困惑。
谢谢
解决方案
这里发生的是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)
推荐阅读
- git - 有人知道 ~BROMIUM 目录是什么吗?它与一个 svg 文件有关
- solr - Tridion 和 SOLR 配置
- javascript - 赛普拉斯如何打破嵌套的 if 循环
- coredns - Coredns 通过 TLS 请求从 Dns 中提取 ServerName
- spring-boot - Spring Integration 轮询文件夹并使用文件内容调用 REST
- python-3.x - 使用 Python 3 测试从 EC2 实例到 S3 的连接
- fluentd - Fluentd 不解析嵌套的 json 数组
- android - 如何在 Android 谷歌地图中收听缩放级别的变化?
- php - 通过连接表获取不同数组中的结果
- google-cloud-platform - 代码:EXTERNAL_RESOURCE_NOT_FOUND;消息:资源'
-compute@developer.gserviceaccount.com' 类型为 'serviceAccount' 未找到