繁体   English   中英

如何为 Pytorch 最大池错误重新定义 model

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM