一、Pooling layers
Pooling layers官網文檔
MaxPool最大池化層下采樣
MaxUnpool最大池化層上采樣
AvgPool最大池化層平均采樣
例如:池化核為(3,3),輸入圖像為(5,5),步長為1,不加邊
最大池化就是選出在池化核為單位圖像中的最大的值
二、MaxPool2d
torch.nn.MaxPool2d官網API
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模式 (2.31取2,向下取整,舍去小數,保留邊緣剩余數據 );False 時使用floor模式 ,默認為False (2.31取3,向上取整,整數加一,舍去邊緣剩余數據 ) |
三、代碼實操
對一個(5,5)的數據進行(kernel_size=3)池化核為(3,3),步長(stride)沒傳 默認為池化核大小(kernel_size=3)為3,padding也沒傳參默認為0表示不加邊,ceil_mode=True保留邊緣剩余數據
MaxPool2d(kernel_size=3,ceil_mode=True)
通過池化層處理之后,輸出一個結果為二維tensor[[5,5],[5,5,]]
import torch
from torch import nn
from torch.nn import MaxPool2dinput = torch.tensor([[1,2,3,4,5],[5,4,3,2,1],[1,2,3,4,5],[5,4,3,2,1],[1,2,3,4,5]],dtype=torch.float32)
#RuntimeError: "max_pool2d" not implemented for 'Long' 需要將數據進行轉換dtype=torch.float32input = torch.reshape(input,(-1,1,5,5))print(input.shape)#torch.Size([1, 1, 5, 5])class Beyond(nn.Module):def __init__(self):super(Beyond,self).__init__()self.maxpool_1 = MaxPool2d(kernel_size=3,ceil_mode=True)def forward(self,input):output = self.maxpool_1(input)return outputbeyond = Beyond()
output = beyond(input)
print(output)
"""
tensor([[[[5., 5.],[5., 5.]]]])
"""
四、池化層意義
保留輸入圖像的特征,同時把數據量給減小
(5,5)的圖像,經過池化層就會變成(3,3)甚至(1,1)
數據量的減小對于神經網絡而言,參數少了,訓練的速度會更快
五、通過池化層處理CIFAR-10數據集
對CIFAR10的1w張測試集數據進行(kernel_size=3)池化核為(3,3),步長(stride)沒傳 默認為池化核大小(kernel_size=3)為3,padding也沒傳參默認為0表示不加邊,ceil_mode=True保留邊緣剩余數據
MaxPool2d(kernel_size=3,ceil_mode=True)
import torch
import torchvision
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdataset_test = torchvision.datasets.CIFAR10("CIFAR_10",train=False,transform=torchvision.transforms.ToTensor(),download=True)dataloader = DataLoader(dataset=dataset_test,batch_size=64)#64張為一組class Beyond(nn.Module):def __init__(self):super(Beyond,self).__init__()self.maxpool_1 = MaxPool2d(kernel_size=3,ceil_mode=True)def forward(self,input):output = self.maxpool_1(input)return outputbeyond = Beyond()
writer = SummaryWriter("y_log")i=0
for data in dataloader:imgs,targets = datawriter.add_images("input_maxpool",imgs,i)output = beyond(imgs)writer.add_images("output_maxpool",output,i)i = i + 1writer.close()
在Terminal下運行tensorboard --logdir=y_log --port=7870
,logdir為打開事件文件的路徑,port為指定端口打開;
通過指定端口7870進行打開tensorboard,若不設置port參數,默認通過6006端口進行打開。
點擊該鏈接或者復制鏈接到瀏覽器打開即可