[英]How to redefine model for Pytorch max pool error
嗨,我正在尝试将张量板用于https://github.com/siddharthvaria/WordPair-CNN/blob/master/src/pytorch_impl/cnn_pdtb_arg_multiclass_jl给出的 model。
但是我在第 135 行得到一个错误: x_max_pools = [F.max_pool1d(xi, xi.size(2)).squeeze(2) for xi in x_convs]
作为
max_pool1d():参数“kernel_size”必须是整数元组。 有什么解决方案可以解决这个问题吗?
There is a discussion about this in pytorch forum - https://discuss.pytorch.org/t/typeerror-avg-pool2d-argument-kernel-size-must-be-tuple-of-ints-not-proxy/108482
引发错误的行应该是第 135 行:
# At this point x_convs is [(batch_size, nfmaps_arg, seq_len_new), ...]*len(fsz_arg)
x_max_pools = [F.max_pool1d(xi, xi.size(2)).squeeze(2) for xi in x_convs] # [(batch_size, nfmaps_arg), ...]*len(fsz_arg)
实际上max_pool1d
减小了表示序列的维度 n°2 的大小(在批处理和通道维度之后), 请参阅文档。 另外,根据您指出的讨论, kernel_size
参数现在在执行时需要一个具体的值,并且不能从输入中动态推断。
幸运的是,您的情况特别简单,因为 kernel 大小是整个序列长度。 换句话说,您的池化实际上是一个全局最大池化,它将序列的大小减少到只有一个标量。 这个标量只是所有值的最大值(检查注释中的形状。)。 所以实际上很容易实现没有动态形状的版本:只需将第 135 行更改为:
x_max_pools = [torch.max(xi, dim=2, keepdim=True) for xi in x_convs] # [(batch_size, nfmaps_arg), ...]*len(fsz_arg)
笔记:
global_max_pooling
层的直接实现,但如您所见,它只是一个torch.max
max_pooling
层一样通过torch.max
传播(例如,一个来源参见此处)torch.max(x, dim=2).squeeze(2)
更改为torch.max(x, dim=2, keepdim=True)
这完全一样,但更干净。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.