我试图用Pytorch建立一个cnn,并且难以进行最大化。我采取了斯坦福大学持有的cs231n。正如我记得的那样,maxpooling可以用作维度推导步骤,例如,我有这个(1,20,高度,宽度)输入ot max_pool2d(假设我的batch_size是1)。如果我使用(1,1)内核,我想得到这样的输出:(1,1,高度,宽度),这意味着内核应该在通道维度上滑动。但是,在检查了pytorch文档之后,它说内核在高度和宽度上滑动。感谢Pytorch论坛上的@ImgPrcSng告诉我使用max_pool3d,结果表明效果很好。但是在conv2d层的输出和max_pool3d层的输入之间仍然存在重塑操作。所以很难被聚合成一个nn.Sequential,所以我想知道还有另外一种方法吗?
答案 0 :(得分:7)
这样的事情会起作用吗?
from torch.nn import MaxPool1D
import functional as F
class ChannelPool(MaxPool1D):
def forward(self, input):
n, c, w, h = input.size()
input = input.view(n,c,w*h).permute(0,2,1)
pooled = F.max_pool1d(input, self.kernel_size, self.stride,
self.padding, self.dilation, self.ceil_mode,
self.return_indices)
_, _, c = input.size()
input = input.permute(0,2,1)
return input.view(n,c,w,h)
答案 1 :(得分:1)
要在所有通道的每个坐标中进行最大池化,只需使用 einops 中的层
from einops.layers.torch import Reduce
max_pooling_layer = Reduce('b c h w -> b 1 h w', 'max')
Layer 可以像任何其他手电筒模块一样在您的模型中使用