池化层原理

最大池化层有时也被称为下采样,目的是保留输入的特征的同时减少数据量。

dilation为空洞卷积,如下图所示。

Ceil_model为当超出区域时,只取最左上角的值。

池化使得数据由5 * 5 变为3 * 3,甚至1 * 1的,这样导致计算的参数会大大减小。例如1080P的电影经过池化的转为720P的电影、或360P的电影后,同样的网速下,视频更为不卡。

池化层处理数据

输入数据

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]])

输入和输出格式如下,N为batch_size,现在可有可无

将输入张量reshape为4维(3维也可以)

input = torch.reshape(input,(-1,1,5,5))

搭建神经网络,依旧创建Tudui类之后,继承初始化父类,创建最大池化层

class Tudui(nn.Module):
    def __init__(self):
        super(Tudui,self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)

forward函数,返回的output为最大池化层的输出

def forward(self,input):
    output = self.maxpool1(input)
    return output

创建神经网络,输入input,并输出output

tudui = Tudui()
output = tudui(input)
print(output)

输出为

完整代码

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]])

input = torch.reshape(input,(-1,1,5,5))

class Tudui(nn.Module):
    def __init__(self):
        super(Tudui,self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)

    def forward(self,input):
        output = self.maxpool1(input)
        return output

tudui = Tudui()
output = tudui(input)
print(output)

池化层处理图片

仍然使用CIFAR10数据集,batch_size设置为64

dataset = datasets.CIFAR10(root="./dataset_transfrom",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset,batch_size=64)

设置step,写日志,遍历数据集中的图像,数据为图像和target,展示出输入和经过最大池化层后的输出,step+1。

step = 0
Writer = SummaryWriter("logs_maxpool")
for data in dataloader:
    imgs,targets = data
    Writer.add_images("input",imgs,step)
    output = tudui(imgs)
    Writer.add_images("output",output,step)
    step += 1

Writer.close()

效果如下

完整代码

from torch.utils.tensorboard import SummaryWriter
import torch
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torchvision import datasets
import torchvision

dataset = datasets.CIFAR10(root="./dataset_transform",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset,batch_size=64)


class Tudui(nn.Module):
    def __init__(self):
        super(Tudui,self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)

    def forward(self,input):
        output = self.maxpool1(input)
        return output

tudui = Tudui()

step = 0
Writer = SummaryWriter("logs_maxpool")
for data in dataloader:
    imgs,targets = data
    Writer.add_images("input",imgs,step)
    output = tudui(imgs)
    Writer.add_images("output",output,step)
    step += 1

Writer.close()

更多推荐