sunpongber

神经网络-最大池化的使用

Pooling layers -> MaxPool2d

MaxPool2d

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

MaxPool2d,最大池化层,有时候也叫下采样
MaxUnpool2d,上采样

最常用的是MaxPool2d

kernel_size:池化窗口的大小,可以是一个整数(表示高度和宽度相同),或者是一个元组 (kH, kW),指定高度和宽度方向的池化窗口大小。

stride (可选):池化窗口滑动的步长。可以是一个整数(表示高度和宽度方向的步长相同),或者是一个元组 (sH, sW),指定高度和宽度方向的步长。如果未指定,默认值为 kernel_size(即没有重叠的池化窗口)。

padding (可选):在输入张量的边界添加的填充量。可以是一个整数(表示高度和宽度方向的填充相同),或者是一个元组 (padH, padW),指定高度和宽度方向的填充量。默认值为 0。

dilation (可选):池化窗口的扩张系数。可以是一个整数(表示高度和宽度方向的扩张系数相同),或者是一个元组 (dH, dW),指定高度和宽度方向的扩张系数。扩张系数决定了池化窗口之间的间隔。默认值为 1(即没有扩张)。(也叫做空洞卷积)

return_indices (可选):如果设置为 True,池化操作会返回两个张量:一个是池化后的输出,另一个是池化窗口中最大值的索引。这在某些情况下(比如实现可逆池化操作)可能有用。默认值为 False。

ceil_mode (可选):如果设置为 True,计算输出张量的大小时会向上取整(ceil);如果设置为 False,则向下取整(floor)。默认值为 False。

最大池化,输入图像(5×5),池化核(3×3),stride的默认值为kernel_size
ceil_mode=True,保留;ceil_mode=False,不保留

import torch
from torch import nn
from torch.nn import MaxPool2d

input = 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)

'''
RuntimeError: "max_pool2d" not implemented for 'Long'

这个错误表明你尝试对一个数据类型为 Long(长整型)的张量执行 max_pool2d 操作,而 PyTorch 的 max_pool2d 函数不支持这种数据类型。

在 PyTorch 中,常见的用于神经网络操作的数据类型是 torch.float32(浮点数)和 torch.float16(半精度浮点数)。

通常情况下,图片数据会以浮点数格式进行处理,因为它们需要进行各种数学运算,而整数类型(如 Long)并不适合这些运算。

在input中dtype=torch.float32
'''

input = torch.reshape(input, (-1, 1, 5, 5)) # 现在输入可以是4维也可以是3维
print(input.shape)

class nn_maxpool(nn.Module):
    def __init__(self):
        super(nn_maxpool, self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)

    def forward(self, input):
        output = self.maxpool1(input)
        return output

nn_maxpool_nn = nn_maxpool()
output = nn_maxpool_nn(input)
print(output)

返回:

torch.Size([1, 1, 5, 5])
tensor([[[[2., 3.],
          [5., 1.]]]])

如果将nn_maxpool类中的ceil_mode=True设置为ceil_mode=False,返回:

torch.Size([1, 1, 5, 5])
tensor([[[[2.]]]])

为什么要进行最大池化?最大池化的作用是什么?
最大池化目的就是保留输入的特征,同时把数据量减小
比如输入图片是5×5,经过池化之后变成2×2的,甚至变成1的
这样数据量就减少了,对整个网络来说它的参数变少了,训练的就会更快

import torch
import torchvision
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10(root="P19_nn_maxpool/dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)

dataLoader = DataLoader(dataset, batch_size=64)

class nn_maxpool(nn.Module):
    def __init__(self):
        super(nn_maxpool, self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)

    def forward(self, input):
        output = self.maxpool1(input)
        return output

nn_maxpool_nn = nn_maxpool()

writer = SummaryWriter(log_dir="logs")

step = 0
for data in dataLoader:
    imgs, targets = data
    writer.add_images("input", imgs, step)
    output = nn_maxpool_nn(imgs)
    writer.add_images("output", output, step)
    step += 1

writer.close()

原始资料地址:
神经网络-最大池化的使用
如有侵权联系删除 仅供学习交流使用