通过前面两节的学习,已经知道如何搭建一个网络模型以及搭建模型一个非常重要的类nn.Module和模型容器Containers。搭建网络模型有两个基本的步骤:建立子模块和拼接子模块。建立的子模块就包括卷积层、池化层、激活层和全连接层等。所以这一节就从子模块开始。

一、卷积运算与卷积层

卷积运算:卷积核在输入信号(图像)上滑动,相应位置进行乘加;
卷积层:又称为滤波器,过滤器,可以认为是某种模式,某种特征。

卷积的过程类似于用一个模版去图像上寻找与它相似的区域,与卷积模式越相似,激活值越高,从而实现特征的提取。

1、1d 2d 3d卷积示意

一般情况下,卷积核在几维上滑动就是几维卷积。
一维卷积示意图

二维卷积示意图

三维卷积示意图

二、卷积的基本属性

卷积核(Kernel):卷积操作的感受野,直观理解是一个滤波矩阵,普遍使用的卷积核大小为3×3、5×5等;
步长(Stride):卷积核遍历特征图时每步移动的像素,如步长为1则每次移动1个像素,步长为2则每次移动2个像素(即跳过1个像素),以此类推;
填充(Padding):处理特征图边界的方式,一般有两种,一种是对边界外完全不填充,只对输入像素执行卷积操作,这样会使输出特征图的尺寸小于输入特征图尺寸;另一种是对边界外进行填充(一般填充为0),再执行卷积操作,这样可使输出特征图的尺寸与输入特征图的尺寸一致;
通道(Channel):卷积层的通道数(层数)。
如下图是一个卷积核(kernel)为3×3、步长(stride)为1、填充(padding)为1的二维卷积:

三、卷积的计算过程

卷积的计算过程非常简单,当卷积核在输入图像上扫描时,将卷积核与输入图像中对应位置的数值逐个相乘,最后汇总求和,就得到该位置的卷积结果。不断移动卷积核,就可算出各个位置的卷积结果。如下图:

四、卷积的各种类型

1、标准卷积

(1)二维卷积(单通道卷积)

在上面的示意图中已经显示过,表示只有一个通道的卷积。如下图是一个卷积核(kernel)为3×3、步长(stride)为1、填充(padding)为0的卷积:

(2)二维卷积(多通道卷积)

拥有多个通道的卷积,例如处理彩色图像时,分别对R, G, B这3个层处理的3通道卷积,如下图:

再将三个通道的卷积结果进行合并(一般采用元素相加),得到卷积后的结果,如下图:

(3)三维卷积

卷积有三个维度(高度、宽度、通道),沿着输入图像的3个方向进行滑动,最后输出三维的结果,如下图:

(4)1x1卷积(1 x 1 Convolution)

当卷积核尺寸为1x1时的卷积,也即卷积核变成只有一个数字。如下图:

从上图可以看出,1x1卷积的作用在于能有效地减少维度,降低计算的复杂度。1x1卷积在GoogLeNet网络结构中广泛使用。

2、反卷积(转置卷积)

卷积是对输入图像提取出特征(可能尺寸会变小),而所谓的“反卷积”便是进行相反的操作。但这里说是“反卷积”并不严谨,因为并不会完全还原到跟输入图像一样,一般是还原后的尺寸与输入图像一致,主要用于向上采样。从数学计算上看,“反卷积”相当于是将卷积核转换为稀疏矩阵后进行转置计算,因此,也被称为“转置卷积”
如下图,在2x2的输入图像上应用步长为1、边界全0填充的3x3卷积核,进行转置卷积(反卷积)计算,向上采样后输出的图像大小为4x4

nn.ConvTranspose2d: 转置卷积实现上采样

参数和卷积运算的参数差不多。
转置卷积的尺寸计算

3、空洞卷积(膨胀卷积)

为扩大感受野,在卷积核里面的元素之间插入空格来“膨胀”内核,形成“空洞卷积”(或称膨胀卷积),并用膨胀率参数L表示要扩大内核的范围,即在内核元素之间插入L-1个空格。当L=1时,则内核元素之间没有插入空格,变为标准卷积。
如下图为膨胀率L=2的空洞卷积:

空洞卷积就可以理解成一个带孔的卷积核,常用于图像分割任务,主要功能就是提高感受野。也就是输出图像的一个参数,能看到前面图像更大的一个区域。

4、可分离卷积

(1)空间可分离卷积

空间可分离卷积是将卷积核分解为两项独立的核分别进行操作。一个3x3的卷积核分解如下图:

分解后的卷积计算过程如下图,先用3x1的卷积核作横向扫描计算,再用1x3的卷积核作纵向扫描计算,最后得到结果。采用可分离卷积的计算量比标准卷积要少。

(2)深度可分离卷积

深度可分离卷积由两步组成:深度卷积和1x1卷积。
首先,在输入层上应用深度卷积。如下图,使用3个卷积核分别对输入层的3个通道作卷积计算,再堆叠在一起。

再使用1x1的卷积(3个通道)进行计算,得到只有1个通道的结果

重复多次1x1的卷积操作(如下图为128次),则最后便会得到一个深度的卷积结果。

完整的过程如下:


图a表示标准卷积,假设输入的特征图尺寸为Df×Df×M,卷积核尺寸为Dk×Dk×M,输出特征图的尺寸为Df×Df×N,标准卷积层的参数量为Dk×Dk×M×N。

图b表示深度卷积,图c表示分点卷积,两者合起来就是深度可分离卷积,深度卷积负责滤波,尺寸为Dk×Dk×1,共M个,作用在输入的每个通道上;逐点卷积负责转化通道,尺寸为1×1×M,共N个,作用在深度卷积的输出特征映射上。

深度卷积的参数量是Dk×Dk×1×M,逐点卷积的参数量是1×1×M×N,所以深度可分离卷积的参数量是标准卷积参数量比值是:

5、扁平卷积(Flattened convolutions)

扁平卷积是将标准卷积核拆分为3个1x1的卷积核,然后再分别对输入层进行卷积计算。这种方式,跟前面的“空间可分离卷积”类似,如下图:

6、分组卷积(Grouped Convolution)

2012年,AlexNet论文中最先提出来的概念,当时主要为了解决GPU显存不足问题,将卷积分组后放到两个GPU并行执行。
在分组卷积中,卷积核被分成不同的组,每组负责对相应的输入层进行卷积计算,最后再进行合并。如下图,卷积核被分成前后两个组,前半部分的卷积组负责处理前半部分的输入层,后半部分的卷积组负责处理后半部分的输入层,最后将结果合并组合。


第一张图是标准的卷积操作,若输入的特征图的尺寸为H×W×c1,卷积核的尺寸为h1×w1×c1,输出特征图的尺寸为H×W×c2,那么标准卷积层的参数量为h1×w1×c1×c2。

第二张图代表的是分组卷积操作,将输入的特征图按通道数分为g组,则每组特征图的尺寸为H×W×(c1/g),对应的卷积核的尺寸为h1×w1×(c1/g),每组输出的特征图尺寸为H×W×(c2/g),将g组的结果拼接(concat),最终输出的特征图的尺寸为H×W×c2,此时分组卷积层的参数量是:
h1×w1×(c1/g)×(c2/g)×g=h1×w1×c1×c2×(1/g)

由此可看出分组卷积的参数量是标准卷积层的(1/g)

7、混洗分组卷积(Shuffled Grouped Convolution)

在分组卷积中,卷积核被分成多个组后,输入层卷积计算的结果仍按照原先的顺序进行合并组合,这就阻碍了模型在训练期间特征信息在通道组之间流动,同时还削弱了特征表示。而混洗分组卷积,便是将分组卷积后的计算结果混合交叉在一起输出。
如下图,在第一层分组卷积(GConv1)计算后,得到的特征图先进行拆组,再混合交叉,形成新的结果输入到第二层分组卷积(GConv2)中:

五、nn.Conv2d实现二维卷积


功能:对多个二维平面信号进行二维卷积
主要参数:

  • in_channels: 输入通道数
  • out_channels: 输出通道数, 等价于卷积核个数
  • kernel_size: 卷积核尺寸,这个代表着卷积核的大小
  • stride: 步长,是指的卷积核滑动的时候,每一次滑动几个像素
  • padding: 填充个数,通常用来保持输入和输出图像的一个尺寸的匹配,
  • dilation: 孔洞卷积大小
  • groups: 分组卷积设置,分组卷积常用于模型的轻量化
  • bias:偏置

尺寸计算:

下面来看一下卷积核是怎么提取特征的

set_seed(3)  # 设置随机种子,改变随机权值的初始化# ================================= load img ==================================
path_img = os.path.join(os.path.dirname(os.path.abspath(__file__)), "lena.png")
img = Image.open(path_img).convert('RGB')  # 0~255# convert to tensor
img_transform = transforms.Compose([transforms.ToTensor()])
img_tensor = img_transform(img)
img_tensor.unsqueeze_(dim=0)    # C*H*W to B*C*H*W# ================================= create convolution layer ==================================# ================ 2d
flag = 1
# flag = 0
if flag:conv_layer = nn.Conv2d(3, 1, 3)   # input:(i, o, size) weights:(o, i , h, w)nn.init.xavier_normal_(conv_layer.weight.data)# calculationimg_conv = conv_layer(img_tensor)
# ================================= visualization ==================================
print("卷积前尺寸:{}\n卷积后尺寸:{}".format(img_tensor.shape, img_conv.shape))
img_conv = transform_invert(img_conv[0, 0:1, ...], img_transform)
img_raw = transform_invert(img_tensor.squeeze(), img_transform)
plt.subplot(122).imshow(img_conv, cmap='gray')
plt.subplot(121).imshow(img_raw)
plt.show()

输出结果:

左边是原始图片,右边是经过二维卷积之后的图片,可以看出在色彩鲜艳的地方比较亮。改变随机种子的设置,来改变权值随机初始化值,可以看到不同的卷积权值对图像经过卷积之后的图像,如下:

通过设置不同的随机种子,可以看出不同权重的卷积核代表不同的模式,会关注图像上的不同特征,所以通过设置多个卷积核对图像的特征进行提取,就可以得到不同的特征。

另外卷积之后图像的尺寸大小:

卷积前,图像尺寸是 512✖️512, 卷积后,图像尺寸是 510✖️5510。这里的卷积核设置,输入通道 3,卷积核个数 1,卷积核大小 3,无 padding,步长是 1,根据上面的公式,输出尺寸: (512-3)/1 + 1 = 510

参考文章:
https://my.oschina.net/u/876354/blog/3064227

pytroch学习笔记六:nn网络层——卷积层相关推荐

  1. 深度学习笔记(24) 卷积层

    深度学习笔记(24) 卷积层 1. 卷积层向前传播 2. 卷积层符号 3. 简单的卷积网络 1. 卷积层向前传播 一个典型的卷积神经网络的卷积层,而通常有三层: 卷积层 Conv 池化层 POOL 全 ...

  2. 【PyTorch】3.3 nn网络层-卷积层

    目录 一.1d/2d/3d卷积 二.卷积–nn.Conv2d() 1. nn.Conv2d() 2. AlexNet:分组卷积 ​3.尺寸计算 4.三维卷积核实现二维卷积 ​三.转置卷积–nn.Con ...

  3. pytorch —— nn网络层 - 卷积层

    目录 1.1d/2d/3d卷积 2.卷积-nn.Conv1d() 2.1 Conv1d的参数说明 2.2 例子说明 3.卷积-nn.Conv2d() 3.1 深入了解卷积层的参数 4.转置卷积-nn. ...

  4. 深度学习笔记(26) 卷积神经网络

    深度学习笔记(26) 卷积神经网络 1. CONV 2. POOL 3. Layer 4. FC 5. 卷积的优势 1. CONV 假设,有一张大小为32×32×3的输入图片,这是一张RGB模式的图片 ...

  5. 深度学习笔记其六:现代卷积神经网络和PYTORCH

    深度学习笔记其六:现代卷积神经网络和PYTORCH 1. 深度卷积神经网络(AlexNet) 1.1 学习表征 1.1 缺少的成分:数据 1.2 缺少的成分:硬件 1.2 AlexNet 1.2.1 ...

  6. (*长期更新)软考网络工程师学习笔记——Section 6 网络层上篇

    目录 一.网络层的定义 二.IPv4数据报 三.IPv4 (一)分类依据 (二)IP地址分类 (三)网络.主机号位数 (四)特殊IP地址 四.划分子网 五.子网掩码 (一)默认子网掩码 (二)VLSM ...

  7. 计算机网络学习(六)—网络层概述以及相关习题

    计算机网络学习(六)-网络层概述以及相关习题 学习内容 一.网络层的概述 二.网络层提供的两种服务 三.IPv4地址的概述 四.分类编址IPv4地址 五.划分子网的IPv4地址 六.无分类编制的IPv ...

  8. 【动手学深度学习PyTorch版】13 卷积层的填充和步幅

    上一篇移步[动手学深度学习PyTorch版]12 卷积层_水w的博客-CSDN博客 目录 一.卷积层的填充和步幅 1.1 填充 1.2 步幅 1.3 总结 二.代码实现填充和步幅(使用框架) 一.卷积 ...

  9. 第三章:zigbee学习笔记之物理层和mac层帧格式分析

    本文原地址:https://blog.csdn.net/tainjau/article/details/81634681 IEEE802.15.4工作组致力于无线个人区域网络(wireless per ...

最新文章

  1. JS 全局对象 全局变量 作用域 (改自TOM大叔博文)
  2. mysql zrm 配置_利用MySQL-zrm来备份和恢复MySQL数据库方法详解
  3. SoapUI启动报错:The JVM could not be started. The maximum heap size (-Xmx) might be too large
  4. 中国都有哪些骨干网?带宽各是多少?
  5. 如何使用git上传本地文件到码云上【详细步骤】
  6. 写毕业论文,要我狗命!
  7. STM32程序占用的内存容量计算
  8. PHP扩展部署之最佳实践
  9. redux之createStore
  10. 三级等保要求配置文档-《物理环境》《网络通信》《区域边界》《计算环境》《管理中心》《管理制度》《运维管理》《硬件配置清单》
  11. java随机生成中文名、性别、手机号、住址、email
  12. 关于已上发布app,升级admob后,激励视频返回code=3 message=“No ad config“
  13. SG-UAP电网项目开发简介
  14. 射频信号空间衰减计算
  15. php圆的周长_php面向对象编程练习:计算矩形、三角形、圆形的周长和面积
  16. 制作CRM管理系统04(客户增加)
  17. 安全架构--4--企业基础安全运营平台建设实践
  18. Odoo免费开源ERP本地化存货核算解决方案访谈实录
  19. 基于Qt的ARM-Linux系统测试工具
  20. yii2 打开GII 的配置

热门文章

  1. 《幻想计划》1.21上线链游玩家|华丽时装、少女养成
  2. 23亿美元!吉利德联手Nurix开发蛋白质降解新疗法
  3. java网上汽车销售网站系统
  4. Vue 视频教程分享
  5. oracle中varchar 和 nvarchar2的区别,Oracle中char,varchar,varchar2,nvarchar,nvarchar2的区别
  6. python实现搜狗微信公众号数据爬取
  7. (九十八)大白话一线电商公司的订单系统是如何进行数据库设计的?
  8. 苹果手机nfc怎么复制门禁卡
  9. 使用Kettle进行数据同步(增量)
  10. oracle transaction scn,关于Oracle DB SCN 生成率过高的 预警及处理建议