一、最大池化的使用
可以打开Pytorch网页,查看池化层:
最大池化也被称为下采样。可以看它的一些参数。
stride的默认值为kernel_size,而ceil_mode设为True时,输出的图像形状会采用向上取整(ceil),设为False时,输出的图像形状会采用向下取整(floor)。
以下面的输入图像为例;
编写代码;
import torch
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]])
# 因为max_pool的输入是四维的,而原来的图像是二维的,所以需要reshape.而shape的第一个参数填-1,后面它会自己计算
input = torch.reshape(input, (-1, 1, 5, 5))
print(input.shape)
结果如下;
torch.Size([1, 1, 5, 5])
定义一个神经网络,输入,再打印输出:
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)
# 因为max_pool的输入是四维的,而原来的图像是二维的,所以需要reshape.而shape的第一个参数填-1,后面它会自己计算
input = torch.reshape(input, (-1, 1, 5, 5))
print(input.shape)
class Cow(nn.Module):
def __init__(self):
super(Cow, self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)
def forward(self, input):
output = self.maxpool1(input)
return output
cow = Cow()
output = cow(input)
print(output)
结果如下:
torch.Size([1, 1, 5, 5])
tensor([[[[2., 3.],
[5., 1.]]]])
注意输入要求格式为浮点数,所以设置了dtype参数。
再修改ceil_mode的参数, 由True -> False,再看运行结果如何。
torch.Size([1, 1, 5, 5])
tensor([[[[2.]]]])
设置dataset和dataloader:
dataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor, download=True)
dataloader = DataLoader(dataset, batch_size=64)
运行如下代码:
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
dataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),
download=True)
dataloader = DataLoader(dataset, batch_size=64)
class Cow(nn.Module):
def __init__(self):
super(Cow, self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=False)
def forward(self, input):
output = self.maxpool1(input)
return output
cow = Cow()
writer = SummaryWriter("logs_maxpool")
step = 0
for data in dataloader:
imgs, targets = data
writer.add_images("input", imgs, step)
output = cow(imgs)
writer.add_images("output", output, step)
step = step + 1
writer.close()
然后打开tensorboard:
这就是图像最大池化的结果。