Pytorch maxpooling over channels维度

Sun*_*eng 0 python neural-network max-pooling pytorch

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

Gav*_*ray 8

会这样的吗?

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)
Run Code Online (Sandbox Code Playgroud)


All*_*leo 5

要在所有通道的每个坐标中进行最大池化,只需使用 einops 中的图层即可

from einops.layers.torch import Reduce

max_pooling_layer = Reduce('b c h w -> b 1 h w', 'max')
Run Code Online (Sandbox Code Playgroud)

图层可以像任何其他火炬模块一样在您的模型中使用