神经网络入门实战:(十一)池化层搭建,以及填充层的说明
(一) 最大池化层的结果与作用:
池化层有很多种,但是最常用的就是最大池化层,
1)结果:
卷积核经过之处,会从输入矩阵中与卷积核尺寸相同的区域中,挑出最大的数;
若卷积核超出输入矩阵的边界,此时 ceil_mode=True
(第二大点介绍)时,将仍然找出最大值;若ceil_mode=False
时,将直接舍弃。最后将输出数值组成一个新的输出矩阵。
2)作用:
- 降维:池化层通过减少输入特征图的尺寸来降低数据的维度。这可以减少后续层的计算量,从而提高训练和推理的速度。
- 特征提取:池化操作能够提取输入数据的主要特征。例如,最大池化(Max Pooling)取每个池化窗口中的最大值,从而保留了局部区域中最显著的特征。这有助于提高模型对特征的关注度。
- 平移不变性:池化层使得模型对于输入数据的微小平移具有一定的鲁棒性。通过保留重要的特征并丢弃不必要的信息,模型可以更好地适应输入的变化。
- 减少过拟合:通过降低模型复杂性,池化层可以帮助减少过拟合的风险。较小的特征图意味着模型学习到的参数更少,从而提高泛化能力。
- 引入抽象:池化层可以通过减少特征图的空间信息,使得后续层能够处理更加抽象的特征。这有助于捕捉更高级的特征表示。
(二) 池化层搭建(Pooling Layers)
池化层不可以改变通道数
最大池化,也被称为“最大下采样池化”。
nn.MaxPool1d
:一维最大池化
nn.MaxPool2d
:二维最大池化(最常用)
nn.MaxPool3d
:三维最大池化
nn.MaxUnpool2d
:二维最大上采样池化
…
调用函数 torch.nn.MaxPool2d
输入只能是浮点型
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
①参数:
-
kernel_size:卷积核的大小。可以是单个数字,也可以是元组。①kernel_size=3,即形状为3×3;②kernel_size=(3,5),即形状为3×5。
这里不用手动设置卷积核的内容 weight ,此模块函数会对一些分布函数进行采样,从而得出 weight 的值,并且这些值都是**可学习的**!!
-
stride:卷积核的步长。可以是单个数字或元组
(sH, sW)
。默认值:kernel_size。 -
padding:输入图像四周的隐式填充。可以是字符串
{'valid', 'same'}
、单个数字或元组(padH, padW)
。默认值:0 ('valid'
表示无填充)。想要输出图像的尺寸和输入图像的尺寸相同,那么填充层就要设置为 (1,1)。
-
ceil_mode:面对卷积核移动到超出输入边界的情况:设置为 True 时,将仍然输出最大值;设置为 False 时,将会舍弃。默认是 False 。
②示例:
import torch
from torch import nn
import torchvision
from torchvision import transforms
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataclass_transform = transforms.Compose([
transforms.ToTensor(),
])
test_dataset = torchvision.datasets.CIFAR10(root='E:\\4_Data_sets\\species recognition', train=False,transform=dataclass_transform, download=True)
test_dataloader = DataLoader(dataset=test_dataset,batch_size=64)
class testNet(nn.Module):
def __init__(self):
super(testNet, self).__init__()
self.maxpool = nn.MaxPool2d(3,ceil_mode=False)
def forward(self, input):
output = self.maxpool(input)
return output
testNet_Instance = testNet()
writer = SummaryWriter('logs')
step = 0
for data in test_dataloader:
imgs, labels = data
writer.add_images("test_maxpool2d_input", imgs, step)
outputs = testNet_Instance(imgs)
writer.add_images("test-maxpool2d_output", outputs, step)
step += 1
writer.close()
运行结果:
(三) 填充层(Padding Layers)
因为卷积层中包含了填充的步骤,所以这里不用单独搭建。
上一篇 | 下一篇 |
---|---|
神经网络入门实战(十) | 神经网络入门实战(十二) |