是什么
:池化層跟卷積層類似有個滑動窗口,用來取一個區(qū)域內的最大值或者平均值。
作用:
卷積神經(jīng)網(wǎng)絡的最后的部分應該要看到整個圖像的全局,通過池化(匯聚)操作,逐漸匯聚要取的像素,最終實現(xiàn)學習全局表示的目標。同時,卷積層的所有優(yōu)勢也被保留在了中間層。
特點:
1.降低卷積層讀對位置的敏感性。(優(yōu)點)
2.降低對空間降采樣表示的敏感性。(優(yōu)點)
3.池化層的輸入通道和輸出通道相同,如X的形狀為[1,2,4,4],1代表樣本數(shù),第二個值:2,代表通道為2,所以輸出的結果通道仍然為2,輸出結果應該為[1,2,計算后的w,計算后的H]
4.使用最大匯聚層以及大于1的步幅,可以減少輸出結果的空間維度(如高度和寬度)。
解釋:
因為池化是選出一個區(qū)域的作最大值或平均值,所以取池化區(qū)域內的像素時不依賴像素的位置。因為池化層往往在卷積層的后面,所以池化層可以降低卷積層對位置的敏感性。同樣也可以降低空間降采樣的敏感性。文章來源:http://www.zghlxwxcb.cn/news/detail-630630.html
池化后的輸出形狀
W = (行數(shù) - 池化行數(shù) + 池化行方向步長) / 池化行方向步長 + 1
H = (列數(shù) - 池化列數(shù) + 池化列方向步長) / 池化列方向步長 + 1文章來源地址http://www.zghlxwxcb.cn/news/detail-630630.html
一.單通道池化
import torch
from torch import nn
from d2l import torch as d2l
池化層的前向傳播函數(shù)
def pool2d(X,pool_size,mode='max'):
p_h,p_w = pool_size
# 池化層與卷積層類似,池化后的輸出形狀計算方法根卷積一樣
Y = torch.zeros((X.shape[0] - p_h + 1,X.shape[1]-p_w+1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
if mode=='max':
Y[i,j] = X[i:i+p_h,j:j+p_w].max()
elif mode=='avg':
Y[i,j] = X[i:i+p_h,j:j+p_w].mean()
return Y
X = torch.tensor([[0.0, 1.0, 2.0],
[3.0, 4.0, 5.0],
[6.0, 7.0, 8.0]])
print(pool2d(X, (2, 2)))
print(pool2d(X, (2, 2),'avg'))
tensor([[4., 5.],
[7., 8.]])
tensor([[2., 3.],
[5., 6.]])
池化層的填充和步幅
X = torch.arange(16,dtype=torch.float32)
print(X)
tensor([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13.,
14., 15.])
#(樣本數(shù),通道數(shù),行數(shù),列數(shù))
X = X.reshape((1,1,4,4))
print(X)
tensor([[[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]]]])
默認步幅與池化窗口相同,當使用3x3的池化窗口,步幅也是3x3
pool2d = nn.MaxPool2d(3)
pool2d(X)
tensor([[[[10.]]]])
手動設置池化尺寸
pool2d = nn.MaxPool2d((2,3),stride=(2,3),padding=(0,1))
pool2d(X)
tensor([[[[ 5., 7.],
[13., 15.]]]])
二.多通道池化
手動設置池化尺寸
pool2d = nn.MaxPool2d((2,3),stride=(2,3),padding=(0,1))
pool2d(X)
輸出:
tensor([[[[ 5., 7.],
[13., 15.]]]])
多通道池化,X的原shape = (1,1,4,4),下句是在第二個維度上增加一個4x4的矩陣 形狀變成 (1,2,4,4)
X = torch.cat((X,X+1),1)
print(X)
print(X.shape)
tensor([[[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]],
[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[13., 14., 15., 16.]]]])
torch.Size([1, 2, 4, 4])
pool2d = nn.MaxPool2d(3,padding=1,stride=2)
X = pool2d(X)
print(X)
print(X.shape) # 池化不像卷積那樣每個通道的結果要合在一起,所以池化層的輸入通道和輸出通道相同
tensor([[[[ 5., 7.],
[13., 15.]],
[[ 6., 8.],
[14., 16.]]]])
# 池化層的輸入通道和輸出通道相同,X的通道為2,所以輸出的結果通道仍然為2,下面第一個1是樣本數(shù),第二個值是通道數(shù)
torch.Size([1, 2, 2, 2])
到了這里,關于6.5 池化層的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!