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则不保留
import torchfrom torch import nnfrom torch.nn import MaxPool2dinput = torch.tensor([[1, 2, 0, 3, 1],[0, 1, 2, 3, 1],[1, 2, 1, 0, 0],[5, 2, 3, 1, 1],[2, 1, 0, 1, 1]], dtype=torch.float32)# Maxpool2d's Input: :math:`(N, C, H_{in}, W_{in})input = torch.reshape(input, (-1, 1, 5, 5))print(input.shape)class DEMO(nn.Module):def __init__(self):super(DEMO, self).__init__()self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)def forward(self,x):x = self.maxpool1(x)return xdemo = DEMO()output = demo(input)print(output)
ceil_mode设置成True时:
ceil_mode设置成False时:
以CIFAR10数据集为例:
池化不同于卷积层,卷积层要设置in_channels 和 out_channels,池化时 输入为三通道的RGB图片输出仍然是三通道的图片。池化的作用可以理解为提取出特征 ,减小运算量。
import torchfrom torch import nnfrom torch.nn import MaxPool2dimport torchvisionfrom torch.utils.data import DataLoaderfrom torch.utils.tensorboard import SummaryWriterdataset = torchvision.datasets.CIFAR10('./dataset',train=False,transform=torchvision.transforms.ToTensor(),download=True)dataloader = DataLoader(dataset,batch_size=64)class DEMO(nn.Module):def __init__(self):super(DEMO, self).__init__()self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)def forward(self,x):x = self.maxpool1(x)return xdemo = DEMO()writer = SummaryWriter('./logs')step = 0for data in dataloader:imgs,targets = dataoutput = demo(imgs)print(imgs.shape)print(output.shape)writer.add_images('input_maxpool',imgs,step)writer.add_images('output_maxpool',output,step)writer.close()
