Pytorch maxpooling over channels维度

时间:2017-10-04 10:26:56

标签: python neural-network pytorch max-pooling

我试图用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,所以我想知道还有另外一种方法吗?

2 个答案:

答案 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 可以像任何其他手电筒模块一样在您的模型中使用