(1)官方文档解释:
dilation:卷积核的元素之间会有差的位置(空洞卷积)
link:conv_arithmetic/README.md at master · vdumoulin/conv_arithmetic · GitHub
公式:
(2)代码实例
搭建神经网络,其中ceil_module=True时:
ceil_module=False时:
最大池化的目的及作用:保留输入的一个特征,同时把输入量减少,进行训练的参数变少,同时训练的更快。
(3)加图片
更改代码:
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
# 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)
# # 最大池化无法对long的数据类型进行操作,要转为浮点数
#
# # -1:自己计算size,自动计算channels的数量;原本是二维矩阵进行尺寸变换成4维的满足输入的要求
# input = torch.reshape(input, (-1,1,5,5))
# print(input.shape)
dataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size=64, )
#搭建神经网络
class Swagkg(nn.Module):
def __init__(self):
super(Swagkg, self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=False)
def forward(self, input):
# 把输入放到最大池化操作中
output = self.maxpool1(input)
return output
swagkg = Swagkg()
writer = SummaryWriter("logs_maxpool")
step = 0
# output = swagkg(input)
# print(output)
for data in dataloader:
imgs, targets = data
# output的尺寸池化的话不会有多个通道,经过最大池化后还是3维的。因此不像卷积那样,不需要reshape
output = swagkg(imgs)
writer.add_images("input", imgs, step)
writer.add_images("output", output, step)
step = step + 1
writer.close()
使用tensorboard显示:
结果:
经结果可看出:经过最大池化,图像变得模糊,但还能隐隐约约看出原本的图像形状。其作用则是,尽量保留了原输入图像的一个信息,但可以使神经网络的数据量大大变小,从而加快训练。很多神经网络经过卷积之后,会加一层池化,然后再进行一个非线性激活。