(一)池化层
卷积层对位置是及其敏感的、例如在前面讲到的对未知的边缘检测中,只要其中有一个像素发生了变化,他的边缘也会发生变化。
所以我们在一定程度上是需要平移不变的。例如:照明,物体位置,比例,外观等淫图象而异。
那么我们通过怎么样的标志能够解决这样一个问题呢?可以通过池化层来解决。它的运作规律就是通过滑动窗口来获取滑动窗口中的最大值。作用在卷积输出层之后,对输出结果有一定的模糊作用。

(1)填充,步幅和多个通道
- 池化层与卷积层类似,具有填充和步幅。
- 没有可以学习的参数。
- 在每个输入通道应用池化层以获得相应的输出通道
- 输出通道数 = 输入通道数
(2)常用的池化层
- 最大池化层:每个窗口中最强的模式信号
获得窗口中的最大值 - 平均池化层:将最大池化层中的“最大”操作替换为“平均”操作
获得窗口中的平均值
(二)代码操作
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()
if mode == "avg":
Y[i, j] = X[i:i+p_h, j:j+p_w].mean()
return Y
X = torch.arange(9,dtype=torch.float32).reshape((3,3))
print(pool2d(X,(2,2)))
print(pool2d(X,(2,2),mode="avg"))
# 填充和步幅
X = torch.arange(16,dtype=torch.float32).reshape((1,1,4,4))
# print(X)
pool2d = nn.MaxPool2d(kernel_size=3,stride=2,padding=0)
print(pool2d(X))
X = torch.cat((X,X+1), 1)
print(X)
pool2d = nn.MaxPool2d(kernel_size=3,stride=2,padding=1)
print(pool2d(X))
网友评论