10.nn_maxpooling

https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html#torch.nn.MaxPool2d

torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)

ceil_mode:如上图这种情况,3×3的池化层只能覆盖2×2的位置(未完全覆盖时),结果是否保留是由ceil_mode来确定,True则保留,False则不保留

  1. import torch
  2. from torch import nn
  3. from torch.nn import MaxPool2d
  4. input = torch.tensor([[1, 2, 0, 3, 1],
  5. [0, 1, 2, 3, 1],
  6. [1, 2, 1, 0, 0],
  7. [5, 2, 3, 1, 1],
  8. [2, 1, 0, 1, 1]], dtype=torch.float32)
  9. # Maxpool2d's Input: :math:`(N, C, H_{in}, W_{in})
  10. input = torch.reshape(input, (-1, 1, 5, 5))
  11. print(input.shape)
  12. class DEMO(nn.Module):
  13. def __init__(self):
  14. super(DEMO, self).__init__()
  15. self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)
  16. def forward(self,x):
  17. x = self.maxpool1(x)
  18. return x
  19. demo = DEMO()
  20. output = demo(input)
  21. print(output)

ceil_mode设置成True时:

ceil_mode设置成False时:

以CIFAR10数据集为例:

池化不同于卷积层,卷积层要设置in_channels 和 out_channels,池化时 输入为三通道的RGB图片输出仍然是三通道的图片。池化的作用可以理解为提取出特征 ,减小运算量。

  1. import torch
  2. from torch import nn
  3. from torch.nn import MaxPool2d
  4. import torchvision
  5. from torch.utils.data import DataLoader
  6. from torch.utils.tensorboard import SummaryWriter
  7. dataset = torchvision.datasets.CIFAR10('./dataset',train=False,transform=torchvision.transforms.ToTensor(),
  8. download=True)
  9. dataloader = DataLoader(dataset,batch_size=64)
  10. class DEMO(nn.Module):
  11. def __init__(self):
  12. super(DEMO, self).__init__()
  13. self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)
  14. def forward(self,x):
  15. x = self.maxpool1(x)
  16. return x
  17. demo = DEMO()
  18. writer = SummaryWriter('./logs')
  19. step = 0
  20. for data in dataloader:
  21. imgs,targets = data
  22. output = demo(imgs)
  23. print(imgs.shape)
  24. print(output.shape)
  25. writer.add_images('input_maxpool',imgs,step)
  26. writer.add_images('output_maxpool',output,step)
  27. writer.close()