torch.nn — PyTorch 2.3 documentation
torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io)
nn.MaxPool2d
class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
参数介绍
- kernel_size(
int
ortuple
) - max pooling的窗口大小。用于设置一个取最大值的窗口,如设置为3,那么会生成一个3×3的窗口 - stride(
int
ortuple
,optional
) - 默认值为kernel_size,步幅,和卷积层中的stride一样 - padding(
int
ortuple
,optional
) - 填充图像,默认填充的值为0 - dilation(
int
ortuple
,optional
) – 一个控制窗口中元素步幅的参数。空洞卷积,即卷积核之间的距离。如卷积核的尺寸为3×3,dilation为1,那么返回一个大小为5×5的卷积核,卷积核每个元素与上下左右的元素之间空一格 - return_indices - 如果等于
True
,会返回输出最大值的序号,对于上采样操作会有帮助。一般用的很少 - ceil_mode - 默认为False。为True时,输出的shape使用ceil格式(向上取整,即进一);为False时,输出的shape使用floor格式(向下取整)。
nn.MaxPool2d的作用
对于输入信号的输入通道,提供2维最大池化(max pooling
)操作
如果输入的大小是(N,C,H,W),那么输出的大小是(N,C,H_out,W_out)和池化窗口大小(kH,kW)的关系是:
如果padding
不是0,会在输入的每一边添加相应数目0dilation
用于控制内核点之间的距离,详细描述在这里
参数kernel_size
,stride
, padding
,dilation
数据类型: 可以是一个int
类型的数据,此时卷积height和width值相同; 也可以是一个tuple
数组(包含来两个int类型的数据),第一个int
数据表示height的数值,tuple
的第二个int类型的数据表示width的数值
操作前后的图像大小计算公式
参数说明:
-
N: 图像的batch_size
-
C: 图像的通道数
-
H: 图像的高
-
W: 图像的宽
计算过程:
shape:
input: (N,C_in,H_in,W_in)
output: (N,C_out,H_out,W_out)or(C_out,H_out,W_out)
看论文的时候,有些比如像padding这样的参数不知道,就可以用这条公式去进行推导
最大池化操作举例
假设有一个5×5的图像和一个3×3的池化核(kenel_size=3),如下图。池化过程就是将池化核与图像进行匹配。下面介绍最大池化的具体操作。
首先用池化核覆盖图像,如下图。然后取到最大值,作为一个输出。
上图为第一次最大池化操作,最大值为2。将2作为一个输出,如下图。
由于本例未对stride进行设置,故stride采取默认值,即stride=kernel_size=3,池化核移动如下图(移动方式与上上文中提到的卷积核移动方式相同,不再赘述)。由于池化核移动已超出范围,要不要取这3×2部分的最大值,取决于call_mode的值,若ceil_mode=True,则取最大值,即输出3;若ceil_mode=False,则不取这部分的值,即这一步不进行池化操作。
假设ceil_mode=True,经过最大池化操作后,输出的结果如下图。
假设ceil_mode=False,经过最大池化操作后,输出的结果如下图。
最大池化的程序代码
示例1
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)
print(input.shape)
input = torch.reshape(input, (-1, 1, 5, 5))
print(input.shape)
class Tudui(nn.Module):
def __init__(self):
super(Tudui, self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)
def forward(self, input):
output = self.maxpool1(input)
return output
tudui = Tudui()
output = tudui(input)
print(output)
输出
示例2
import torchvision
import torch
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import Dataset, DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor(),
download=True)
dataloader = DataLoader(dataset, batch_size=64)
class Tudui(nn.Module):
def __init__(self):
super(Tudui, self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)
def forward(self, input):
output = self.maxpool1(input)
return output
tudui = Tudui()
writer = SummaryWriter('logs')
step = 1
for data in dataloader:
imgs, target= data
writer.add_images("input", imgs, step)
output = tudui(imgs)
writer.add_images("output", output, step)
step += 1
writer.close()
对比输入输出,可以看出图像更糊了