Pytorch error: TypeError: adaptive_avg_pool3d(): argument 'output_size' (position 2) must be tuple of ints, not list
Pytorch error: TypeError: adaptive_avg_pool3d(): argument 'output_size' (position 2) must be tuple of ints, not list
我在 Pytorch 中尝试使用 AdaptiveAvgPool3D 时遇到此错误。下面是错误轨迹
Traceback (most recent call last):
文件“/scratch/a.bip5/BraTS 2021/./sisa.py”,第 395 行,在
输出 = 模型(输入)
文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/modules/module.py”,第 1051 行,在 _call_impl
return forward_call(*输入, **kwargs)
文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/parallel/data_parallel.py”,第 166 行,向前
return self.module(*输入[0], **kwargs[0])
文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/modules/module.py”,第 1051 行,在 _call_impl
return forward_call(*输入, **kwargs)
文件“/scratch/a.bip5/BraTS 2021/./sisa.py”,第 96 行,向前
x1 = self.pool1(x)
文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/modules/module.py”,第 1051 行,在 _call_impl
return forward_call(*输入, **kwargs)
文件“/scratch/a.bip5/BraTS 2021/./sisa.py”,第 135 行,向前
x1=aa(x)
文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/modules/module.py”,第 1051 行,在 _call_impl
return forward_call(*输入, **kwargs)
文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/modules/pooling.py”,第 1166 行,向前
returnF.adaptive_avg_pool3d(输入,self.output_size)
文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/functional.py”,第 1148 行,在 adaptive_avg_pool3d
return torch._C._nn.adaptive_avg_pool3d(输入, _output_size)
TypeError: adaptive_avg_pool3d(): 参数 'output_size' (位置 2)必须是整数元组,而不是列表
查看错误堆栈时,我在 ../functional.py:
中找到了这段代码
if has_torch_function_unary(input):
return handle_torch_function(
adaptive_max_pool3d_with_indices, (input,), input, output_size, return_indices=return_indices
)
_output_size = _list_with_default(output_size, input.size())
return torch._C._nn.adaptive_max_pool3d(input, _output_size)
打印出 output_size 和 _output_size 的类型显示了一个元组(因为它应该是),另一个在 lib 函数本身中传递之前变成了一个列表。我不明白的是,如果使用此列表的函数不喜欢它,为什么会发生这种到列表的转换?如果这样做的目的是为了报错,那么满足has_torch_function_unary
条件的条件是什么?
如有任何帮助,我们将不胜感激。
编辑:
我试图通过在最后的 return 语句中使用 output_size
而不是 _output_size
来回避问题。这导致了一个更神秘的错误-
TypeError: adaptive_avg_pool3d(): 参数 'output_size' (位置 2)必须是整数元组,而不是元组
pytorch如何区分整数元组和元组?
错误背后的原因原来是类型错误。将大小传递给 AdaptiveAvgPool3d 时,我通过除法获得了大小的值。尽管余数为 0,但默认情况下除法将值保存为 python 中的浮点数。这意味着作为 output_size
传递的元组实际上是一个 float 元组,_list_with_default 变成一个列表,但如果元组是由 int 组成的,则可能不会。简单地对传递给 AdaptiveAvgPool3d 的每个维度使用 int(..) 就是解决方案。
我在 Pytorch 中尝试使用 AdaptiveAvgPool3D 时遇到此错误。下面是错误轨迹
Traceback (most recent call last):
文件“/scratch/a.bip5/BraTS 2021/./sisa.py”,第 395 行,在 输出 = 模型(输入) 文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/modules/module.py”,第 1051 行,在 _call_impl return forward_call(*输入, **kwargs) 文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/parallel/data_parallel.py”,第 166 行,向前 return self.module(*输入[0], **kwargs[0]) 文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/modules/module.py”,第 1051 行,在 _call_impl return forward_call(*输入, **kwargs) 文件“/scratch/a.bip5/BraTS 2021/./sisa.py”,第 96 行,向前 x1 = self.pool1(x) 文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/modules/module.py”,第 1051 行,在 _call_impl return forward_call(*输入, **kwargs) 文件“/scratch/a.bip5/BraTS 2021/./sisa.py”,第 135 行,向前 x1=aa(x) 文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/modules/module.py”,第 1051 行,在 _call_impl return forward_call(*输入, **kwargs) 文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/modules/pooling.py”,第 1166 行,向前 returnF.adaptive_avg_pool3d(输入,self.output_size) 文件“/home/a.bip5/.conda/envs/pix2pix/lib/python3.9/site-packages/torch/nn/functional.py”,第 1148 行,在 adaptive_avg_pool3d return torch._C._nn.adaptive_avg_pool3d(输入, _output_size) TypeError: adaptive_avg_pool3d(): 参数 'output_size' (位置 2)必须是整数元组,而不是列表
查看错误堆栈时,我在 ../functional.py:
中找到了这段代码if has_torch_function_unary(input):
return handle_torch_function(
adaptive_max_pool3d_with_indices, (input,), input, output_size, return_indices=return_indices
)
_output_size = _list_with_default(output_size, input.size())
return torch._C._nn.adaptive_max_pool3d(input, _output_size)
打印出 output_size 和 _output_size 的类型显示了一个元组(因为它应该是),另一个在 lib 函数本身中传递之前变成了一个列表。我不明白的是,如果使用此列表的函数不喜欢它,为什么会发生这种到列表的转换?如果这样做的目的是为了报错,那么满足has_torch_function_unary
条件的条件是什么?
如有任何帮助,我们将不胜感激。
编辑:
我试图通过在最后的 return 语句中使用 output_size
而不是 _output_size
来回避问题。这导致了一个更神秘的错误-
TypeError: adaptive_avg_pool3d(): 参数 'output_size' (位置 2)必须是整数元组,而不是元组
pytorch如何区分整数元组和元组?
错误背后的原因原来是类型错误。将大小传递给 AdaptiveAvgPool3d 时,我通过除法获得了大小的值。尽管余数为 0,但默认情况下除法将值保存为 python 中的浮点数。这意味着作为 output_size
传递的元组实际上是一个 float 元组,_list_with_default 变成一个列表,但如果元组是由 int 组成的,则可能不会。简单地对传递给 AdaptiveAvgPool3d 的每个维度使用 int(..) 就是解决方案。