【Pytorch神经网络理论篇】 32 PNASNet模型:深层可分离卷积+组卷积+空洞卷积

1 PNASNet模型简介

    PNASNet模型是Google公司的AutoML架构自动搜索所产生的模型,它使用渐进式网络架构搜索技术,并通过迭代自学习的方式,来寻找最优网络结构。即用机器来设计机器学习算法,使得它能够更好地服务于用户提供的数据。该模型在ImageNet数据集上Top-1准确率达到82.9%,Top-5准确率达到96。2%,是目前最好的图片分类模型之一。
    PNASNet模型最主要的结构是Normal Cell和Reduction Cell(参见arXⅳ网站上编号为1712.00559的论文),NASNet模型的主要结构使用残差结构多分支卷积技术,还添加深度可分离卷积(组卷积的一种特殊形式)空洞卷积的处理。

2 组卷积

组卷积是指对原有的输入数据先分组,再做卷积操作。不但能够增强卷积核之间的对角相关性且减少训练参数,不易过拟合,类似于正则效果。AlexNet模型使用了组卷积技术。

2.1 组卷积的操作规则

2.1.1 普通卷积和组卷积的不同

普通卷积和组卷积最大的不同就是卷积核在不同通道上卷积后的操作。

普通卷积是用卷积核在各个通道上进行卷积求和,所得的每一个特征图都会包含之前各个通道上的特征信息。

组卷积是按照分组来进行卷积融合操作,在各个分组之间进行普通卷积后融合,融合生成的特征图仅包含其对应分组中所有通道的特征信息。

 2.2  代码实现组卷积

2.2.1 代码实现

import torchinput1 = torch.ones([1,12,5,5])groupsconv = torch.nn.Conv2d(in_channels=12,out_channels=6,kernel_size=3,groups=3) # 定义组卷积,输入输出通道必须是groups的整数倍
Group_convolution = groupsconv(input1)
print("查看组卷积的卷积核的形状",groupsconv.weight.size()) # torch.Size([6, 4, 3, 3])
print("查看组卷卷积的结果形状:",Group_convolution.size()) # torch.Size([1, 6, 3, 3])conv = torch.nn.Conv2d(in_channels=12,out_channels=6,kernel_size=3,groups=1) # 定义普通卷积
Ordinary_convolution = conv(input1)
print("查看普通卷积的卷积核的形状",conv.weight.size()) # torch.Size([6, 12, 3, 3])
print("查看普通卷积的结果形状:",Ordinary_convolution.size()) # torch.Size([1, 6, 3, 3])

2.2.2 代码讲解

组卷积使用了6个4通道卷积核,处理过程如下
1、将输入数据的12个通道分成3组,每组4个通道。
2、将输入数据中第1组的4个通道分别与第1个4通道卷积核进行卷积操作,将4个通道的卷积结果加和,得到第1个通道的特征图。
3、将输入数据中第1组的4个通道分别与第2个4通道卷积核进行卷积操作,将第(3)步的结果按照第(2)步的方式加和,得到第2个通道的特征图。
4、将输入数据中第2组的4个通道分别与第3、4个4通道卷积核按照第(2)~(3)步操作,得到第3、4个通道的特征图。
5、将输入数据中第3组的4个通道分别与第5、6个4通道卷积核按照第(2)~(3)步操作,得到第5、6个通道的特征图。
6、最终得到6个通道的组卷积结果。

普通卷积则直接将12个通道的卷积核与12个通道的输入数据做卷积操作,并对其结果进行加和,得到第1个通道的特征图。重复5次这种操作,完成整个卷积过程。

2.3 组卷积的优缺点

2.3.1 组卷积的优势

组卷积的优势是可以减少参数数量和计算量,可以选择组卷积中的组大小来提高DNN的分类精度。

2.3.2 组卷积的劣势

在组卷积中,随意地选择组大小会导致计算复杂性和数据重用程度之间的不平衡,影响计算的效率。

3 深度可分离卷积

深度可分离卷积是指对每一个输入的通道分别用不同的卷积核卷积。

3.1 深度可分离卷积文章来源

Xception模型是Inception系列模型的统称,其使用深度可分离卷积的主要目的是将通道相关性和平面空间维度相关性进行解耦,使得在通道关系和平面空间关系上的卷积操作相互独立,以达到更好的效果。(参见arXⅳ网站上编号1610.02357的论文)。

3.2 代码实现:深度可分离卷积

3.2.1 代码简述

在深度可分离卷积中,使用参数k来定义每个输入通道对应的卷积核个数,其输出通道数为(k×输入通道数)。

3.2.2 代码实现:深度可分离卷积

# 案例:实现了k为2的深度可分离卷积,在对输入通道为4的数据进行深度可分离卷积操作时,为其每个通道匹配2个1通道卷积核进行卷积操作。# 深度可分离卷积在实现时,直接将组卷积中的groups参数设为与输入通道in_channels相同即可。
import  torch
input1 = torch.ones([1,4,5,5])
conv = torch.nn.Conv2d(in_channels=4,out_channels=8,kernel_size=3) # 定义普通卷积
depthwise_conv = torch.nn.Conv2d(in_channels=4,out_channels=8,kernel_size=3,groups=4) # 定义一个k为2的深度可分离卷积,out_channels/in_channelsOrdinary_convolution = conv(input1) # 普通卷积
print("查看普通卷积的卷积核的形状",conv.weight.size()) # torch.Size([8, 4, 3, 3])
print("查看普通卷积的结果形状:",Ordinary_convolution.size()) # torch.Size([1, 8, 3, 3])Depthwise_convolution = depthwise_conv(input1) # 可分离深度卷积
print("查看深度可分离卷积的卷积核的形状",depthwise_conv.weight.size()) # torch.Size([8, 1, 3, 3])
print("查看深度可分离卷积的结果形状:",Depthwise_convolution.size()) # torch.Size([1, 8, 3, 3])

4 空洞卷积

4.1 空洞卷积的含义

空洞卷积是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。利用添加空洞扩大感受野,让原本3x3的卷积核,在相同参数量和计算量下拥有5x5或者更大的感受野,从而无需下采样。

4.2 空洞卷积的图解

4.3 空洞卷积的代码实现

4.3.1空洞卷积代码概述

空洞卷积也可以直接通过卷积类的diation参数来实现。diiation参数代表卷积核中每个元素之间的间隔,默认是1代表普通类。

4.3.2 空洞卷积的代码实现

import torch
# 1.0 准备数据
arr = torch.tensor(range(1,26),dtype=torch.float32) # 生成5×5的模拟数据
arr = arr.reshape([1,1,5,5]) # 对模拟数据进行变形
print("模拟数据:",arr)
# 模拟数据:tensor([[[[ 1.,  2.,  3.,  4.,  5.],
#               [ 6.,  7.,  8.,  9., 10.],
#               [11., 12., 13., 14., 15.],
#               [16., 17., 18., 19., 20.],
#               [21., 22., 23., 24., 25.]]]])# 1.1 普通卷积部分
Ordinary_Convolution = torch.nn.Conv2d(1,1,3,stride=1,bias=False,dilation=1) # 普通卷积
torch.nn.init.constant_(Ordinary_Convolution.weight,1) # 对Ordinary_Convolution的卷积核初始化
print("Ordinary_Convolution的卷积核:",Ordinary_Convolution.weight.size())
# 输出 Ordinary_Convolution的卷积核:torch.Size([1, 1, 3, 3])
ret_Ordinary = Ordinary_Convolution(arr)
print("普通卷积的结果:",ret_Ordinary)
# 输出 普通卷积的结果:tensor([[[[ 63.,  72.,  81.], [108., 117., 126.],[153., 162., 171.]]]], grad_fn=<ThnnConv2DBackward0>)# 1.2 空洞卷积部分
Atrous_Convolution = torch.nn.Conv2d(1,1,3,stride=1,bias=False,dilation=2) # 空洞卷积
torch.nn.init.constant_(Atrous_Convolution.weight,1) # 对Atrous_Convolution的卷积核初始化
print("Atrous_Convolution的卷积核:",Atrous_Convolution.weight.size())
# 输出 Atrous_Convolution的卷积核:torch.Size([1, 1, 3, 3])
ret_Atrous = Atrous_Convolution(arr)
print("空洞卷积的结果:",ret_Atrous)
# 输出 空洞卷积的结果:tensor([[[[117.]]]], grad_fn=<SlowConvDilated2DBackward0>)

 4.4 空洞卷积的理论实现

扩张卷积/空洞卷积向卷积层引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时各值的间距。

换句话说,相比原来的标准卷积,扩张卷积 多了一个扩张率dilatation rate的参数,指的是kernel各点之前的间隔数量。

4.5 空洞卷积与普通卷积的对比

4.5.1 普通3×3卷积

4.5.2 空洞卷积(dilation rate=2的3×3卷积)

下图是一个扩张率为2的3×3卷积核,感受野与5×5的卷积核相同,而且仅需要9个参数。你可以把它想象成一个5×5的卷积核,每隔一行或一列删除一行或一列。

在相同的计算条件下,空洞卷积提供了更大的感受野。空洞卷积经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑空洞卷积。

4.6 空洞卷积的两大优势:

4.6.1 扩大感受野

在deep net中为了增加感受野且降低计算量,总要进行降采样,这样虽然可以增加感受野,但导致降低空间分辨率。为了不丢失分辨率,且仍然扩大感受野,可以使用空洞卷积。这在检测分割任务中空洞卷积十分有用。一方面扩大感受野可以检测分割大目标,另一方面分辨率高可以精确定位目标.

4.6.2 捕获多尺度上下文信息

空洞卷积有一个参数可以设置dilation rate,具体含义就是在卷积核中填充dilation rate个0。因此,当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息.多尺度信息在视觉任务中相当重要。

使用空洞卷积代替下采样/上采样可以很好的保留图像的空间特征,也不会损失图像信息。当网络层需要更大的感受野,但是由于计算资源有限无法提高卷积核数量或大小时,可以考虑使用空洞卷积。

4.7  空洞卷积存在的问题:

4.7.1 网格效应

当多次叠加扩张率为2的3*3 kernel时,会产生如下问题:


  
4.7.2 远距离信息可能不相关

如果光采用大的扩张率的卷积可能只对一些大物体分割有效果。设计空洞卷积层的关键在于如何同时处理不同大小物体的关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

s5k5e2ya MIPI 摄像头调试

1、驱动移植的话按照我之前的文章来做 驱动里面注意是几路的lane,一般mipi的话是差分信号&#xff0c;2路和4路是比较常见的。2、mipi波形 很明显上面的波形是不正确的。dp dn有一个都成了正弦波了。 首先&#xff0c;我们要找一下正确的波形 正确的波形应该是DP和DN不会同时…

css那些事儿4 背景图像

background:背景颜色&#xff0c;图像&#xff0c;平铺方式&#xff0c;大小&#xff0c;位置 能够显示背景区域即为盒子模型的填充和内容部分&#xff0c;其中背景图像将会覆盖背景颜色。常见的水平或垂直渐变颜色背景通常使用水平或垂直渐变的背景图像在水平或垂直方向平铺&a…

用Android UEventObserver监听内核event

很多时候我们在框架上层需要知道内核中某些事件的状态&#xff0c;用设备的show属性是可以供上层来查询&#xff0c;但是这需要上层设定一个较耗资源的循环。如果用UEventObserver就可以监听内核event&#xff0c;它是android Java层利用uevent与获取Kernel层状态变化的机制。 …

【Pytorch神经网络实战案例】23 使用ImagNet的预训练模型识别图片内容

1 案例基本工具概述 1.1 数据集简介 Imagenet数据集共有1000个类别&#xff0c;表明该数据集上的预训练模型最多可以输出1000种不同的分类结果。 Imagenet数据集是目前深度学习图像领域应用得非常多的一个领域&#xff0c;关于图像分类、定位、检测等研究工作大多基于此数据…

杂谈转载

一、什么是运行时&#xff08;Runtime&#xff09;? 运行时是苹果提供的纯C语言的开发库&#xff08;运行时是一种非常牛逼、开发中经常用到的底层技术&#xff09;二、运行时的作用&#xff1f; 能获得某个类的所有成员变量能获得某个类的所有属性能获得某个类的所有方法交换…

Linux中的工作队列

工作队列(work queue)是Linux kernel中将工作推后执行的一种机制。这种机制和BH或Tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行&#xff0c;因此工作队列的优势就在于它允许重新调度甚至睡眠。 工作队列是2.6内核开始引入的机制&#xff0c;在2.6.20之后…

【Pytorch神经网络实战案例】24 基于迁移学习识别多种鸟类(CUB-200数据集)

1 迁移学习 在实际开发中&#xff0c;常会使用迁移学习将预训练模型中的特征提取能力转移到自己的模型中。 1.1 迁移学习定义 迁移学习指将在一个任务上训练完成的模型进行简单的修改&#xff0c;再用另一个任务的数据继续训练&#xff0c;使之能够完成新的任务。 1.1.1 迁…

linux工作队列

这里对Linux的工作队列(work_queue)不做深层次的挖掘&#xff0c;只对如何使用它以及一些简单的结构做简单地介绍。 Linux源代码(3.0.8)中和工作队列(work_queue)相关的结构主要在 include/linux/workqueue.h这个头文件中&#xff0c;这里就不摘抄了。这里就直接给出例子代码…

【Pytorch神经网络理论篇】 33 基于图片内容处理的机器视觉:目标检测+图片分割+非极大值抑制+Mask R-CNN模型

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

linux inputuevent使用

input 输入子系统 在应用层使用的时候&#xff0c;容易出现找不到UEventObserver.java 这时候就要导入jar包 导入classes.jar这个jar包 weiqifaweiqifa-Inspiron-3847:~/weiqifa/tm100$ ls out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/ classes classes…

linq中给字段添加别名

linq 是我们在查询中经常回用到的一种形式,比如我们创建一个类,然后List<添加> 并绑定到表格中public class Modeltest{string id;public string Id{get { return id; }set { id value; }}string pwd;public string Pwd{get { return pwd; }set { pwd value; }}string…

报错 ValueError: too many values to unpack (expected 2)

enc_output,enc_slf_attn self.slf_attn(user_embedding,item_input,item_input,mask slf_attn_mask) 实际上只有一个返回值&#xff0c;但是却写了两个返回值&#xff0c;所以报错。 改正为 enc_output self.slf_attn(user_embedding,item_input,item_input,mask sl…

Python带*参数和带**参数

一、带*形参 1、格式&#xff1a;*形参名&#xff0c;如*args 2、数据类型&#xff1a;元组 3、传参方式&#xff1a;接收任意个位置参数&#xff08;可以不传参&#xff09;。 4、位置&#xff1a;在一个函数里只能有一个&#xff0c;且放在末尾&#xff08;没有带**形参的…

IE浏览器解决无法识别js中getElementsByClassName问题

关于ie浏览器无法识别js中getElementsByClassName问题&#xff0c;现通过以下方法&#xff0c;引用如下js /***打印js对象详细信息*/ function alertObj(obj) {var description "";for ( var i in obj){var property obj[i];description i " " prope…

arduino i2c 如何写16位寄存器_树莓派3B开发Go语言(二)寄存器版本GPIO

作者&#xff1a;爪爪熊链接&#xff1a;https://www.jianshu.com/p/0495c0554a63來源&#xff1a;简书之前将go语言的运行环境给搭建起来了&#xff0c;但是没有开始真正的试试Go 语言操作树莓派硬件的效果。一、树莓派3B硬件介绍树莓派3B采用了博通的BCM2837方案&#xff0c;…

Android aidl在Framework的使用

为何要做这个 我要在framework的PhoneWindowManager.java里面调用LightService.java里面的函数&#xff0c;用来做灯光的提示之类的&#xff0c;为何我要在PhoneWindowManager.java里面加这个呢&#xff0c;这里就不做讨论了&#xff0c;但是直接调用哪些接口是不行的&#xf…

没有理智的欲望会走向毁灭,没有欲望的理智会永守清贫

欲望是人类的本性,哥伦布因为它片帆浮海、横渡大洋发现了美州。理性是人类的禀赋,哥白尼因为它仰望星空、冥想终生提出了日心说。在金融市场上没有理智的欲望会走向毁灭,没有欲望的理智会永守清贫。转载于:https://www.cnblogs.com/timlong/p/6509870.html

【Pytorch神经网络实战案例】25 (带数据增强)基于迁移学习识别多种鸟类(CUB-200数据集)

1 数据增强 在目前分类效果最好的EficientNet系列模型中&#xff0c;EfficientNet-B7版本的模型就是使用随机数据增强方法训练而成的。 RandAugment方法也是目前主流的数据增强方法&#xff0c;用RandAugment方法进行训练&#xff0c;会使模型的精度得到提升。 2 RandAugment…

Capture images using V4L2 on Linux

这文章相当好&#xff0c;没有理由不转载 I have always been using OpenCV’s VideoCapture API to capture images from webcam or USB cameras. OpenCV supportsV4L2 and I wanted to use something other than OpenCV’s VideoCapture API so I started digging up about …

diskgenius 数据迁移_U盘格式化后数据恢复免费方法教程

U盘里的数据一般都很重要&#xff0c;比如论文或者办公文件&#xff0c;而有时候我们会被病毒或者误操作把U盘给格式化了&#xff0c;这时候要怎么恢复U盘里的数据呢&#xff0c;只有一个办法&#xff0c;就是用U盘数据恢复软件&#xff0c;但网上此类软件虽然很多&#xff0c;…