神经网络-最大池化的使用
Pooling layers -> 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()
原始资料地址:
神经网络-最大池化的使用
如有侵权联系删除 仅供学习交流使用