学习目录
池化层
最大池化,也被称为下采样,nn.MaxPool2d 相反的上采样:nn.MaxUnpool2d
主要使用的为:MaxPool2d
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
-
kernel_size 和卷积核相似,就是用来取最大值的一个窗口。
-
stride 移动步长 默认值为Kernel_size的一个大小
-
padding 填充
-
dilation 窗口是否分散开来来使用。空洞 ,一般不使用示例:
-
return_indices 暂时不用
-
ceil_mode 取值是向上取整还是向下取整! 为True则执行ceil即不满足窗口大小也要保留数值。相反为floor不保留舍弃。默认为False!
最大池化过程:
我们了解到,卷积是卷积核与图像重合数值进行相乘再相加得到输出的一个位置数值。
池化过程是,池化窗口与图像重合,选取重合数值中原图像数值最大的数值作为输出位置数值。
具体实现过程:
import torch
from torch import nn
from torch.nn import MaxPool2d
"""
本文件主要演示池化层在网络中的设定,以及各参数对输出结果的影响!
MaxPool2d参数:
kernel_size 池化核形状
ceil_mode 是否抛弃边缘。True不抛弃
使用需要传入
input(N,C,H,W) or input(C,H,W) N-batchsize大小 c通道数
运行后获得的内容:
output(N,C,H,W) or output(C,H,W)
"""
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)
# 参数需要。所以需要变形
input = torch.reshape(input, (-1, 1, 5, 5))
print(input.shape)
class MyModule(nn.Module):
def __init__(self):
super().__init__()
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)
def forward(self, input):
output = self.maxpool1(input)
return output
mymodule = MyModule()
output = mymodule(input)
print(output)
结果:与手动计算相同
torch.Size([1, 1, 5, 5])
tensor([[[[2., 3.],
[5., 1.]]]])
ceil_mode=Flase后:与手动计算相同
torch.Size([1, 1, 5, 5])
tensor([[[[2.]]]])
最大池化的作用:
保留输入数据的基本特征,并将数据量进行减小。
图像池化后的可视化展示
import torch
import torchvision.datasets
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
"""
本文件主要演示池化层在网络中的可视化展示
MaxPool2d参数:
kernel_size 池化核形状
ceil_mode 是否抛弃边缘。True不抛弃
使用需要传入
input(N,C,H,W) or input(C,H,W) N-batchsize大小 c通道数
运行后获得的内容:
output(N,C,H,W) or output(C,H,W)
"""
dataset = torchvision.datasets.CIFAR10("../DataSet/dataset", train=False, transform=torchvision.transforms.ToTensor(),
download=False)
dataloader = DataLoader(dataset, batch_size=64)
class MyModule(nn.Module):
def __init__(self):
super().__init__()
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=False)
def forward(self, input):
output = self.maxpool1(input)
return output
mymodule = MyModule()
writer = SummaryWriter("maxpool")
for data in dataloader:
imgs, targets = data
output = mymodule(imgs)
writer.add_images("input", imgs)
writer.add_images("output", output)
break
writer.close()