目录

(1)本文涉及的函数

(2)池化层

(3)感受野

(4)代码示例(含注释)


承接上两篇博客:卷积层(空洞卷积对比普通卷积)、激活函数层


(1)本文涉及的函数

import torch

import torch.nn as nn

from torch import autograd

  1. nn.MaxPool1d                             # 1 维最大池化(max pooling)操作
  2. nn.MaxPool2d                             # 1 维最大池化(max pooling)操作
  3. nn.MaxPool3d                             # 1 维最大池化(max pooling)操作
  4. nn.MaxUnPool1d                         # Maxpool1d 的逆过程
  5. nn.MaxUnPool2d                         # Maxpool2d 的逆过程
  6. nn.MaxUnPool3d                         # Maxpool3d 的逆过程
  7. nn.AvgPool1d                              # 1 维的平均池化(average pooling)
  8. nn.AvgPool2d                              # 2 维的平均池化(average pooling)
  9. nn.AvgPool3d                              # 3 维的平均池化(average pooling)
  10. nn.FractionalMaxPool2d             # 2 维的分数最大池化
  11. nn.LPPool2d                                 # 2 维的幂平均池化
  12. nn.AdaptiveMaxPool1d               # 1 维的自适应最大池化
  13. nn.AdaptiveMaxPool2d               # 2 维的自适应最大池化
  14. nn.AdaptiveAvgPool1d                # 1 维的自适应平均池化
  15. nn.AdaptiveAvgPool2d                # 2 维的自适应平均池化

最大池化的公式:

torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, # ceil_mode=False)

输入参数说明:

  • kernel_size(int or tuple) - max pooling 的窗口大小
  • stride(int or tuple, optional) - max pooling 的窗口移动的步长。默认值是 kernel_size
  • padding(int or tuple, optional) - 输入的每一条边补充 0 的层数
  • dilation(int or tuple, optional) – 一个控制窗口中元素步幅的参数
  • return_indices - 如果等于 True,会返回输出最大值的序号,对于上采样操作会有帮助
  • ceil_mode - 如果等于 True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作

(2)池化层

在卷积网络中,通常会在卷积层之间增加池化(Pooling)层,以降低特征图的参数量,提升计算速度,增加感受野,是一种降采样操作。 池化是一种较强的先验,可以使模型更关注全局特征而非局部出现的位置,这种降维的过程可以保留一些重要的特征信息,提升容错能力,并且还能在一定程度上起到防止过拟合的作用。

在物体检测中,常用的池化有最大值池化(Max Pooling)与平均值池化(Average Pooling)。池化层有两个主要的输入参数,即核尺寸 kernel_size与步长stride。如图1 所示为一个核尺寸与步长都为2的最大值池化过程,以左上角为例,9、20、15与26进行最大值池化,保留 26。

图1 池化过程示例

(3)感受野

感受野(Receptive Field)是指特征图上的某个点能看到的输入图像的区域,即特征图上的点是由输入图像中感受野大小区域的计算得到的。举个简单的例子,如图2 所示为一个三层卷积网络,每一层的卷 积核为3×3,步长为1,可以看到第一层对应的感受野是3×3,第二层是 5×5,第三层则是7×7。

图2 感受野示意图

卷积层和池化层都会影响感受野,而激活函数层通常对于感受野没有影响。对于一般的卷积神经网络,感受野可由下面两个公式计算得出。

其中,RF(l+1)与RF(l)分别代表第(l+1)层与第(l)层的感受野,k代表第(l+1)层卷积核的大小,S(l)代表前(l)层的步长之积。注意,当前层的步长并不影响当前层的感受野。

通过上述公式求取出的感受野通常很大,而实际的有效感受野 (Effective Receptive Field)往往小于理论感受野。从图2 也可以看出,虽然第三层的感受野是7×7,但是输入层中边缘点的使用次数明显比中间点要少,因此做出的贡献不同。经过多层的卷积堆叠之后,输入层对于特征图点做出的贡献分布呈高斯分布形状。

理解感受野是理解卷积神经网络工作的基础,尤其是对于使用 Anchor作为强先验区域的物体检测算法,如Faster RCNN和SSD,如何设置Anchor的大小,Anchor应该对应在特征图的哪一层,都应当考虑感受野。通常来讲,Anchor的大小应该与感受野相匹配,尤其是有效的感受野,过大或过小都不好。

在卷积网络中,有时还需要计算特征图的大小,一般可以按照下面的公式进行计算。

其中,N(in)与N(out)分别为输入特征图与输出特征图的尺寸,p代表这一 层的padding大小,k代表这一层的卷积核大小,s为步长。

(4)代码示例(含注释)

import torch
import torch.nn as nn
from torch import autograd# torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False,
# ceil_mode=False)
# 参数:
# kernel_size(int or tuple) - max pooling 的窗口大小
# stride(int or tuple, optional) - max pooling 的窗口移动的步长。默认值是 kernel_size
# padding(int or tuple, optional) - 输入的每一条边补充 0 的层数
# dilation(int or tuple, optional) – 一个控制窗口中元素步幅的参数
# return_indices - 如果等于 True,会返回输出最大值的序号,对于上采样操作会有帮助
# ceil_mode - 如果等于 True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作
# # 对于输入信号的输入通道,提供 1 维最大池化(max pooling)操作
mp = nn.MaxPool1d(3, stride=1)
input = autograd.Variable(torch.Tensor([[20, 16, 50, 10, 20],[20, 16, 10, 10, 20],[20, 16, 60, 10, 20],[20, 16, 15, 10, 20],[20, 16, 22, 10, 20]]))
output = mp(input)
print(output)# # 对于输入信号的输入通道,提供 2 维最大池化(max pooling)操作
mp = nn.MaxPool2d((3, 2), stride=(2, 1))
input = autograd.Variable(torch.Tensor([[[20, 16, 50, 10, 20],[20, 16, 10, 10, 20],[20, 16, 60, 10, 20],[20, 16, 15, 10, 20],[20, 16, 22, 10, 20]],[[20, 16, 50, 10, 20],[20, 16, 10, 10, 20],[20, 16, 60, 10, 20],[20, 16, 15, 10, 20],[20, 16, 22, 10, 20]]]))
output = mp(input)
print(output)# 对于输入信号的输入通道,提供 3 维最大池化(max pooling)操作
# pool of square window of size=3, stride=2
m = nn.MaxPool3d(3, stride=2)
# pool of non-square window
m1 = nn.MaxPool3d((3, 2, 2), stride=(2, 1, 2))
input = torch.randn(20, 16, 50, 44, 31)
output = m(input)
output1 = m1(input)
print(output.size())
print(output1.size())# =========================================================== #
# Maxpool1d 的逆过程,不过并不是完全的逆过程,因为在 maxpool1d 的过程中,一些最大值的已经丢失。
# MaxUnpool1d 输入 MaxPool1d 的输出,包括最大值的索引,并计算所有 maxpool1d 过程中非最大值被设置为零的部分的反向。
pool = nn.MaxPool1d(2, stride=2, return_indices=True)
unpool = nn.MaxUnpool1d(2, stride=2)
input = autograd.Variable(torch.Tensor([[[1, 2, 3, 4, 5, 6, 7, 8]]]))
output, indices = pool(input)
print(output, indices)
out_unpool = unpool(output, indices)
print(out_unpool)# Maxpool2d
# Maxpool3d# =========================================================== #
# torch.nn.AvgPool1d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True)
# 在由多个输入平面组成的输入信号上应用一维平均池化。
# # 参数:
# kernel_size(int or tuple) - 池化窗口大小
# stride(int or tuple, optional) - max pooling 的窗口移动的步长。默认值是 kernel_size
# padding(int or tuple, optional) - 输入的每一条边补充 0 的层数
# dilation(int or tuple, optional) – 一个控制窗口中元素步幅的参数
# return_indices - 如果等于 True,会返回输出最大值的序号,对于上采样操作会有帮助
# ceil_mode - 如果等于 True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作
ap = nn.AvgPool1d(3, stride=2)
output = ap(autograd.Variable(torch.Tensor([[[1, 2, 3, 4, 5, 6, 7, 8, 10]]])))
print(output)# torch.nn.AvgPool2d: 对信号的输入通道,提供 2 维的平均池化(average pooling)
# torch.nn.AvgPool3d: 对信号的输入通道,提供 3 维的平均池化(average pooling)# =========================================================== #
# torch.nn.FractionalMaxPool2d
# 在由多个输入平面组成的输入信号上应用 2D 分数最大池化。
# # params
# kernel_size(int or tuple) - 最大池化操作时的窗口大小。可以是一个数字(表示 K*K 的窗口),也可以是一个元组(kh*kw)
# output_size - 输出图像的尺寸。可以使用一个 tuple 指定(oH,oW),也可以使用一个数字 oH 指定一个 oH*oH 的输出。
# output_ratio – 将输入图像的大小的百分比指定为输出图片的大小,使用一个范围在(0,1)之间的数字指定
# return_indices - 默认值 False,如果设置为 True,会返回输出的索引,索引对 nn.MaxUnpool2d 有用。
# # pool of square window of size=3, and target output size 3*2
m = nn.FractionalMaxPool2d(3, output_size=(3, 2))
# # pool of square window and target output size being half of input image size
m1 = nn.FractionalMaxPool2d(3, output_ratio=(0.5, 0.5))
input = autograd.Variable(torch.Tensor([[[20, 16, 50, 10, 20],[20, 16, 10, 10, 20],[20, 16, 11, 10, 20],[20, 16, 15, 10, 20],[20, 16, 22, 10, 20]],[[20, 16, 50, 10, 20],[20, 16, 10, 10, 20],[20, 16, 12, 10, 20],[20, 16, 15, 10, 20],[20, 16, 22, 10, 20]]]))
output = m(input)
output1 = m1(input)
print(output)
print(output1)# =========================================================== #
# torch.nn.LPPool2d(norm_type, kernel_size, stride=None, ceil_mode=False)
# 对输入信号提供 2 维的幂平均池化操作。
# f(X) = \sqrt[p]{\sum_{x \in X} x^{p}}
# 当 p 为无穷大的时候时,等价于最大池化操作
# 当 p=1 时,等价于平均池化操作
# # power-2 pool of square window of size=3, stride=2
m = nn.LPPool2d(2, 3, stride=2)
# # pool of non-square window of power 1.2
m1 = nn.LPPool2d(1.2, (3, 2), stride=(2, 1))
input = autograd.Variable(torch.Tensor([[[21, 16, 50, 10, 20],[20, 16, 10, 10, 20],[20, 16, 11, 10, 20],[20, 16, 15, 10, 20],[20, 16, 22, 10, 20]],[[20, 16, 50, 10, 20],[20, 16, 10, 10, 20],[20, 16, 12, 10, 20],[20, 16, 15, 10, 20],[20, 16, 22, 10, 20]]]))
output = m(input)
output1 = m1(input)
print(output)
print(output1)# =========================================================== #
# torch.nn.AdaptiveMaxPool1d(output_size, return_indices=False)
# 对输入信号,提供 1 维的自适应最大池化操作
# 对于任何输入大小的输入,可以将输出尺寸指定为 H,但是输入和输出特征的数目不会变化。
# # 参数:
# output_size: 输出信号的尺寸
# return_indices: 如果设置为 True,会返回输出的索引。对 nn.MaxUnpool1d 有用,默认值是 False
m = nn.AdaptiveAvgPool1d(5)   # target output size of 5
input = autograd.Variable(torch.randn(1, 64, 8))
output = m(input)
print(output.size())# torch.nn.AdaptiveMaxPool2d(output_size, return_indices=False)
# 对输入信号,提供 2 维的自适应最大池化操作
# 对于任何输入大小的输入,可以将输出尺寸指定为 H*W,但是输入和输出特征的数目不会变化。
# # params
# output_size: 输出信号的尺寸,可以用(H,W)表示 H*W 的输出,也可以使用数字 H 表示 H*H 大小的输出
# return_indices: 如果设置为 True,会返回输出的索引。对 nn.MaxUnpool2d 有用,默认值是 Falsem = nn.AdaptiveMaxPool2d((5, 7))  # target output size of 5x7
input = autograd.Variable(torch.randn(1, 64, 8, 9))
m1= nn.AdaptiveMaxPool2d(7)  # target output size of 7x7 (square)
input1 = autograd.Variable(torch.randn(1, 64, 10, 9))
output = m(input)
output1 = m1(input1)
print(output.size())
print(output1.size())# =========================================================== #
# torch.nn.AdaptiveAvgPool1d(output_size)
# 对输入信号,提供 1 维的自适应平均池化操作
# 对于任何输入大小的输入,可以将输出尺寸指定为 H*W,但是输入和输出特征的数目不会变化。
# output_size: 输出信号的尺寸
# target output size of 5
m = nn.AdaptiveAvgPool1d(5)
input = autograd.Variable(torch.randn(1, 64, 8))
output = m(input)
print(output.size())# torch.nn.AdaptiveAvgPool2d(output_size
# 对输入信号,提供 2 维的自适应平均池化操作

>>>本文参考:Pytoch官方文件 &&《深度学习之PyTorch物体检测实战》

>>>如有疑问,欢迎评论区一起探讨

池化层(pooling layer) 感受野(Receptive Field) 神经网络的基本组成相关推荐

  1. CNN(卷积层convolutional layer,激励层activating layer,池化层pooling,全连接层fully connected)

    CNN产生的原因:当使用全连接的神经网络时,因为相邻两层之间的神经元都是有边相连的,当输入层的特征纬度非常高时(譬如图片),全连接网络需要被训练的参数就会非常多(参数太多,训练缓慢),CNN可以通过训 ...

  2. 图像处理池化层pooling和卷积核

    1.池化层的作用 在卷积神经网络中,卷积层之间往往会加上一个池化层.池化层可以非常有效地缩小参数矩阵的尺寸,从而减少最后全连层中的参数数量.使用池化层即可以加快计算速度也有防止过拟合的作用. 2.为什 ...

  3. 池化层-Pooling(CNN卷积神经网络)

    文章目录 汇聚层(池化层) 最大汇聚层和平均汇聚层 填充和步幅 多个通道 小结 汇聚层(池化层) 本节将介绍汇聚(pooling)层(又名池化层),它具有双重目的: 1.降低卷积层对位置的敏感性 2. ...

  4. cs231n-(7)卷积神经网络:架构,卷积层/池化层

    架构总览 常用的层 卷积层 概述 池化层 归一化层 全连接层 全连接层转为卷积层 卷积网络架构 层模式 层大小设计模式 实例 计算资源考虑 额外资源 卷积神经网络和普通神经网络非常类似.卷积神经网络由 ...

  5. 深度学习笔记(一):卷积层+池化层+激活函数+全连接层

    写在前面:大家好!我是[AI 菌],一枚爱弹吉他的程序员.我热爱AI.热爱分享.热爱开源! 这博客是我对学习的一点总结与记录.如果您也对 深度学习.机器视觉.算法.Python.C++ 感兴趣,可以关 ...

  6. 深入学习卷积神经网络中卷积层和池化层的意义(转)

    为什么要使用卷积呢? 在传统的神经网络中,比如多层感知机(MLP),其输入通常是一个特征向量:需要人工设计特征,然后将这些特征计算的值组成特征向量,在过去几十年的经验来看,人工找到的特征并不是怎么好用 ...

  7. 深入学习卷积神经网络中卷积层和池化层的意义

    为什么要使用卷积呢? 在传统的神经网络中,比如多层感知机(MLP),其输入通常是一个特征向量:需要人工设计特征,然后将这些特征计算的值组成特征向量,在过去几十年的经验来看,人工找到的特征并不是怎么好用 ...

  8. 深度学习之卷积神经网络(7)池化层

    深度学习之卷积神经网络(7)池化层 在卷积层中,可以通过调节步长参数s实现特征图的高宽成倍缩小,从而降低了网络的参数量.实际上,处理通过设置步长,还有一种专门的网络层可以实现尺寸缩减功能,它就是这里要 ...

  9. 深度学习入门 (九):卷积层和池化层的实现

    目录 卷积神经网络 CNN 整体结构 卷积层 全连接层存在的问题 卷积运算 乘积累加运算 偏置 填充 (padding) 步幅 (stride) 小结:卷积层的输出特征图的大小 3 维数据的卷积运算 ...

最新文章

  1. css盒子子类继承父类哪些,css不继承父类的属性有哪些
  2. MATLAB2014b下运行cuda6.5安装方法及例程
  3. C51对标准C语言的扩展 / 数据类型
  4. python编程基础 张健 pdf_Python编程基础
  5. django框架中的模型
  6. B9.流行的框架与新技术
  7. 外媒:苹果高管正拜访亚洲供应商,探讨苹果汽车生产事宜
  8. python——redis
  9. python基础(12):Standard Library标准库(包含正则)
  10. 笔记本电脑风扇转速测试软件,笔记本温度查看和风扇转速调节工具
  11. 海康、大华设备搜索大概实现原理
  12. 电商系统——订单页面展示
  13. python识图 web_python+flask搭建CNN在线识别手写中文网站
  14. 细胞分裂模拟(C++)
  15. 【朋友圈点赞】测试场景(十一)
  16. 2019年8月21日 星期三(韩天峰的个人简历)
  17. Scratch(三):跳一跳
  18. 在oracle数据库中存储数据库的文件是,Oracle数据库,oracle
  19. uni-app KeyChain(钥匙串),保存的信息不会因App被删除而丢失(ios)
  20. drf celery

热门文章

  1. Gitee项目分享——学之思开源考试系统
  2. 扫雷小游戏最详细讲解【C语言】
  3. python27.dll引起的appcrash_Python已经停止工作(APPCRASH)Python
  4. STM32H7B0 HAL OSPI配置的一次失败原因分享
  5. phpadmin的安装教程
  6. 浏览器或是搜索引擎怎么拉黑某个网站
  7. 中国移动 烽火HG6543C5光猫 获取超级密码教程
  8. 计算机仿真塞曼效应实验报告,塞曼效应实验报告[完整版].doc
  9. Swift使用UserDefaults存储,报错 Fatal error: ‘try‘ expression unexpectedly raised an error: Swift.Decoding
  10. android开发之UI