《动手学深度学习 Pytorch版》 6.5 汇聚层
import torch
from torch import nn
from d2l import torch as d2l
6.5.1 最大汇聚和平均汇聚
汇聚层和卷积层类似,区别在于汇聚层不带包含参数,汇聚操作是确定性的,通常计算汇聚窗口中所有元素的最大值或平均值,即最大汇聚和平均汇聚。
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]])
pool2d(X, (2, 2)), pool2d(X, (2, 2), 'avg')
(tensor([[4., 5.],
[7., 8.]]),
tensor([[2., 3.],
[5., 6.]]))
6.5.2 填充和步幅
汇聚层和卷积层一样可以通过填充和步幅获得所需的输出形状。
X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4)) # 构建一个四维度的输入张量
X
tensor([[[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]]]])
pool2d = nn.MaxPool2d(3) # 默认情况下,步幅为 (3,3)
pool2d(X)
tensor([[[[10.]]]])
pool2d = nn.MaxPool2d(3, padding=1, stride=2) # 步幅也可以手动设定
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.]]]])
6.5.3 多个通道
汇聚层在每个通道上单独计算,也就是说输入通道数和输出通道数相同。
X = torch.cat((X, X + 1), 1) # 加上两个通道
X, 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)
pool2d(X)
tensor([[[[ 5., 7.],
[13., 15.]],
[[ 6., 8.],
[14., 16.]]]])
练习
(1)尝试将平均汇聚层作为卷积层的特例情况实现。
(2)尝试将最大汇聚层作为卷积层的特例情况实现。
不会
(3)假设汇聚层的输入大小为 ,则汇聚窗口的形状为 ,填充为 ,步幅为 。这个汇聚层的计算成本是多少?
(4)为什么最大汇聚层和平均汇聚层的工作方式不同?
啥叫工作方式不同?需要最大就最大,需要平均就平均呗。
(5)我们是否需要最小汇聚层?可以用已知函数替代它吗?
最小没必要吧,带0的全给整成0了,没意义。
(6)除了平均汇聚层和最大汇聚层,是否还有其他函数可以考虑?(提示:回想一下 softmax。)为什么它就不流行?
卷积很大程度上减少了计算量,把计算量再拉回去属于是自断优点了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了