《动手学深度学习 Pytorch版》 6.5 汇聚层

python 复制代码
import torch
from torch import nn
from d2l import torch as d2l

6.5.1 最大汇聚和平均汇聚

汇聚层和卷积层类似,区别在于汇聚层不带包含参数,汇聚操作是确定性的,通常计算汇聚窗口中所有元素的最大值或平均值,即最大汇聚和平均汇聚。

python 复制代码
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
python 复制代码
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 填充和步幅

汇聚层和卷积层一样可以通过填充和步幅获得所需的输出形状。

python 复制代码
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.]]]])
python 复制代码
pool2d = nn.MaxPool2d(3)  # 默认情况下,步幅为 (3,3)
pool2d(X)
复制代码
tensor([[[[10.]]]])
python 复制代码
pool2d = nn.MaxPool2d(3, padding=1, stride=2)  # 步幅也可以手动设定
pool2d(X)
复制代码
tensor([[[[ 5.,  7.],
          [13., 15.]]]])
python 复制代码
pool2d = nn.MaxPool2d((2, 3), stride=(2, 3), padding=(0, 1))
pool2d(X)
复制代码
tensor([[[[ 5.,  7.],
          [13., 15.]]]])

6.5.3 多个通道

汇聚层在每个通道上单独计算,也就是说输入通道数和输出通道数相同。

python 复制代码
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]))
python 复制代码
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
pool2d(X)
复制代码
tensor([[[[ 5.,  7.],
          [13., 15.]],

         [[ 6.,  8.],
          [14., 16.]]]])

练习

(1)尝试将平均汇聚层作为卷积层的特例情况实现。

(2)尝试将最大汇聚层作为卷积层的特例情况实现。

不会


(3)假设汇聚层的输入大小为 c × h × w c\times h\times w c×h×w,则汇聚窗口的形状为 p h × p w p_h\times p_w ph×pw,填充为 ( p h , p w ) (p_h,p_w) (ph,pw),步幅为 ( s h , s w ) (s_h,s_w) (sh,sw)。这个汇聚层的计算成本是多少?

⌊ ( n h − k h + p h + s h ) / s h ⌋ × ⌊ ( n w − k w + p w + s w ) / s w ⌋ × c × p h × p w \left\lfloor(n_h-k_h+p_h+s_h)/s_h\right\rfloor\times\left\lfloor(n_w-k_w+p_w+s_w)/s_w\right\rfloor\times c\times p_h\times p_w ⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋×c×ph×pw


(4)为什么最大汇聚层和平均汇聚层的工作方式不同?

啥叫工作方式不同?需要最大就最大,需要平均就平均呗。


(5)我们是否需要最小汇聚层?可以用已知函数替代它吗?

最小没必要吧,带0的全给整成0了,没意义。


(6)除了平均汇聚层和最大汇聚层,是否还有其他函数可以考虑?(提示:回想一下 softmax。)为什么它就不流行?

卷积很大程度上减少了计算量,把计算量再拉回去属于是自断优点了。

相关推荐
聆风吟º4 小时前
CANN runtime 全链路拆解:AI 异构计算运行时的任务管理与功能适配技术路径
人工智能·深度学习·神经网络·cann
uesowys4 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
AI_56784 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
User_芊芊君子4 小时前
CANN大模型推理加速引擎ascend-transformer-boost深度解析:毫秒级响应的Transformer优化方案
人工智能·深度学习·transformer
智驱力人工智能5 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
qq_160144875 小时前
亲测!2026年零基础学AI的入门干货,新手照做就能上手
人工智能
Howie Zphile5 小时前
全面预算管理难以落地的核心真相:“完美模型幻觉”的认知误区
人工智能·全面预算
人工不智能5775 小时前
拆解 BERT:Output 中的 Hidden States 到底藏了什么秘密?
人工智能·深度学习·bert
盟接之桥5 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
kfyty7255 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai