CNN卷积中的池化层pooling

2022-09-05  本文已影响0人  小黄不头秃

(一)池化层

卷积层对位置是及其敏感的、例如在前面讲到的对未知的边缘检测中,只要其中有一个像素发生了变化,他的边缘也会发生变化。

所以我们在一定程度上是需要平移不变的。例如:照明,物体位置,比例,外观等淫图象而异。

那么我们通过怎么样的标志能够解决这样一个问题呢?可以通过池化层来解决。它的运作规律就是通过滑动窗口来获取滑动窗口中的最大值。作用在卷积输出层之后,对输出结果有一定的模糊作用。

(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))
上一篇 下一篇

猜你喜欢

热点阅读