27李沐动手学深度学习v2/池化层

单通道二维池化

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
    # 输出shape=(输入行-池化高+1, 输入列-池化宽+1)
    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

# 单通道,只有2维
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.]])
填充和步幅
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

Cell In [2], line 1
----> 1 填充和步幅


NameError: name '填充和步幅' is not defined
# 1输入通道数,1输出通道数
X=torch.arange(16,dtype=torch.float32).reshape((1, 1, 4, 4))
print(X.shape)
# 使用默认值,步幅=池化窗口大小
# (4+0+0-3+4)/4=1,(4+0+0-3+4)/4=1
pool2d=nn.MaxPool2d(3)
print(pool2d(X).shape)
# 手动设定填充和步幅
# (4+1+1-3+2)/2=2, (4+1+1-3+2)/2=2
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
print(pool2d(X).shape)
# (4+1+1-2+2)/2=3, (4+1+1-3+3)/3=2
pool2d = nn.MaxPool2d((2,3), padding=(1,1),stride=(2, 3))
print(pool2d(X).shape)

多通道二维池化

print(X.shape)
# !cat是沿维数直接拼接,stack是沿着维数产生维度再进行拼接
# cat拼接之后的维度=序列长度*要拼接维度原来值
# stack堆叠之后的维度=序列长度
# +1元素加1,序列长度=2,第1维 1*2
X=torch.cat((X,X+1),1)
print(X.shape)
# 会在每个通道单独做池化
pool2d=nn.MaxPool2d(3,padding=1,stride=2)
print(pool2d(X).shape)

query
池化层位置

  • 答:池化层一般放到卷积层的后面

池化层窗口重叠

  • 答:一般stride=池化层窗口大小,现在不=了,没有太多区别,池化层用的很少了

池化层

  • 答:不改变通道数

池化层用的很少了

  • 答:作用,卷积对位置信息不敏感,stride>2减少输出的维数。
  • 答:针对第1个作用对数据就做很多处理(平移,旋转,畸变),针对第2个作用stride可以放到卷积

正则

  • 控制模型的复杂度,减少参数的选择范围

你可能感兴趣的:(深度学习,深度学习,python,计算机视觉)