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

本文涉及的产品
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,100CU*H 3个月
简介: PNASNet模型是Google公司的AutoML架构自动搜索所产生的模型,它使用渐进式网络架构搜索技术,并通过迭代自学习的方式,来寻找最优网络结构。即用机器来设计机器学习算法,使得它能够更好地服务于用户提供的数据。该模型在ImageNet数据集上Top-1准确率达到82.9%,Top-5准确率达到96。2%,是目前最好的图片分类模型之一。

815902569f6a467a99304f9ac1482386.png


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 普通卷积和组卷积的不同


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


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


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


63b2ec9888274fa98b251b481d4ac084.png


2.2  代码实现组卷积


2.2.1 代码实现


import torch
input1 = 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_channels
Ordinary_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 空洞卷积的图解


20190409145025144.jpg

20190409145123849.png



20190409145225514.png


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卷积


51636a8cac004d8eb6cef0e18de60ef6.png


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


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


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


ff0fbba346ff41ab80afb7fc1a96d1b9.png


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时,会产生如下问题:


3af853c03d3c4fda80a2373305c5724b.png


4.7.2 远距离信息可能不相关


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

目录
相关文章
|
2天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
18 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
24天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
241 55
|
1月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
168 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
1月前
|
机器学习/深度学习 人工智能 PyTorch
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
本文探讨了Transformer模型中变长输入序列的优化策略,旨在解决深度学习中常见的计算效率问题。文章首先介绍了批处理变长输入的技术挑战,特别是填充方法导致的资源浪费。随后,提出了多种优化技术,包括动态填充、PyTorch NestedTensors、FlashAttention2和XFormers的memory_efficient_attention。这些技术通过减少冗余计算、优化内存管理和改进计算模式,显著提升了模型的性能。实验结果显示,使用FlashAttention2和无填充策略的组合可以将步骤时间减少至323毫秒,相比未优化版本提升了约2.5倍。
56 3
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
|
1月前
|
机器学习/深度学习 资源调度 算法
图卷积网络入门:数学基础与架构设计
本文系统地阐述了图卷积网络的架构原理。通过简化数学表述并聚焦于矩阵运算的核心概念,详细解析了GCN的工作机制。
100 3
图卷积网络入门:数学基础与架构设计
|
21天前
|
机器学习/深度学习 算法 PyTorch
基于Pytorch Gemotric在昇腾上实现GraphSage图神经网络
本文详细介绍了如何在昇腾平台上使用PyTorch实现GraphSage算法,在CiteSeer数据集上进行图神经网络的分类训练。内容涵盖GraphSage的创新点、算法原理、网络架构及实战代码分析,通过采样和聚合方法高效处理大规模图数据。实验结果显示,模型在CiteSeer数据集上的分类准确率达到66.5%。
|
16天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
71 1
|
21天前
|
监控 安全 BI
什么是零信任模型?如何实施以保证网络安全?
随着数字化转型,网络边界不断变化,组织需采用新的安全方法。零信任基于“永不信任,永远验证”原则,强调无论内外部,任何用户、设备或网络都不可信任。该模型包括微分段、多因素身份验证、单点登录、最小特权原则、持续监控和审核用户活动、监控设备等核心准则,以实现强大的网络安全态势。
102 2
|
2月前
|
机器学习/深度学习 自然语言处理 数据可视化
【由浅到深】从神经网络原理、Transformer模型演进、到代码工程实现
阅读这个文章可能的收获:理解AI、看懂模型和代码、能够自己搭建模型用于实际任务。
139 11
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)##
在当今的人工智能领域,深度学习已成为推动技术革新的核心力量之一。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,因其在图像和视频处理方面的卓越性能而备受关注。本文旨在深入探讨CNN的基本原理、结构及其在实际应用中的表现,为读者提供一个全面了解CNN的窗口。 ##

热门文章

最新文章

下一篇
开通oss服务