是什么
:池化层跟卷积层类似有个滑动窗口,用来取一个区域内的最大值或者平均值。
作用:
卷积神经网络的最后的部分应该要看到整个图像的全局,通过池化(汇聚)操作,逐渐汇聚要取的像素,最终实现学习全局表示的目标。同时,卷积层的所有优势也被保留在了中间层。
特点:
1.降低卷积层读对位置的敏感性。(优点)
2.降低对空间降采样表示的敏感性。(优点)
3.池化层的输入通道和输出通道相同,如X的形状为[1,2,4,4],1代表样本数,第二个值:2,代表通道为2,所以输出的结果通道仍然为2,输出结果应该为[1,2,计算后的w,计算后的H]
4.使用最大汇聚层以及大于1的步幅,可以减少输出结果的空间维度(如高度和宽度)。
解释:
因为池化是选出一个区域的作最大值或平均值,所以取池化区域内的像素时不依赖像素的位置。因为池化层往往在卷积层的后面,所以池化层可以降低卷积层对位置的敏感性。同样也可以降低空间降采样的敏感性。
W = (行数 - 池化行数 + 1 + 池化行方向步长) / 池化行方向步长
H = (列数 - 池化列数 + 1 + 池化列方向步长) / 池化列方向步长
import torch
from torch import nn
from d2l import torch as d2l
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.])
#(样本数,通道数,行数,列数)
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.]]]])
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 = 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是样本数,第二个值是通道数
torch.Size([1, 2, 2, 2])