‘壹’ 浜哄伐鏅鸿兘瀛︿範鐢ㄤ粈涔堢紪绋嬭蒋浠跺ソ锛
浜哄伐鏅鸿兘瀛︿範闇瑕佷娇鐢ㄩ傚悎镄勭紪绋嬭蒋浠舵潵缂栧啓鍜岃皟璇旷畻娉曞拰妯″瀷銆傚湪阃夋嫨缂栫▼杞浠舵椂锛岄渶瑕佹牴鎹涓浜哄亸濂姐佹妧鑳芥按骞冲拰椤圭洰闇姹傛潵缁煎悎钥冭槛銆备互涓嬫槸涓浜涘父鐢ㄧ殑浜哄伐鏅鸿兘缂栫▼杞浠讹细‘贰’ 如何建立神经网络模型
人工神经网络有很多种,我只会最常用的BP神经网络。不同的网络有不同的结构和不同的学习算法。
简单点说,人工神经网络就是一个函数。只是这个函数有别于一般的函数。它比普通的函数多了一个学习的过程。
在学习的过程中,它根据正确结果不停地校正自己的网络结构,最后达到一个满意的精度。这时,它才开始真正的工作阶段。
学习人工神经网络最好先安装MathWords公司出的MatLab软件。利用该软件,你可以在一周之内就学会建立你自己的人工神经网络解题模型。
如果你想自己编程实现人工神经网络,那就需要找一本有关的书籍,专门看神经网络学习算法的那部分内容。因为“学习算法”是人工神经网络的核心。最常用的BP人工神经网络,使用的就是BP学习算法。
‘叁’ Keras快速构建神经网络模型
用Keras搭建神经网络的步骤:
深度学习框架Keras——像搭积木般构建神经网络,主要分为7个部分,每个部分只需要几个keras API函数就能实现,用户即可像搭积木般一层层构建神经网络模型。
1. 创建模型 Create model
2. 添加层级 Add Layer
3. 模型编译 Compile
4. 数据填充 Fit
5. 模型评估 Evaluate
6. 模型预测 Predict
7. 模型保存 Save model
下面章节会对每一部分具体来介绍。。。
Keras 中主要有三类模型:Sequential model, Functional model, Subclass model
在开始创建模型之前,首先需要引入tensorflow和keras模块,然后再创建一个Sequential model
Sequential API定义如下:
layers参数可以为空, 然后通过add method向模型中添加layer,相对应的通过pop method移除模型中layer。
创建Function API模型,可以调用Keras.Model来指定多输入多数出。
Keras.Model定义:
Layers是神经网络基本构建块。一个Layer包含了tensor-in/tensor-out的计算方法和一些状态,并保存在TensorFlow变量中(即layers的权重weights)。
Layers主要分为6个类别,基础层,核心层,卷基层,池化层,循环层,融合层。
对派生类的实现可以用以下方法:
** init (): 定义layer的属性,创建layer的静态变量。
** build(self, input_shape): 创建依赖于输入的变量,可以调用add_weight()。
** call(self, *args, **kwargs): 在确保已调用build()之后,在 call 中调用。
** get_config(self): 返回包含用于初始化此层的配置的字典类型。
创建SimpleDense派生类,在build()函数里添加trainable weights。实现y=input*w +b
结果输出:
创建ComputeSum派生类,在 init 函数里添加 non-trainable weights。实现输入矩阵沿轴0元素相加后,x=x+self.total
结果输出:
核心层是最常用的层,涉及到数据的转换和处理的时候都会用到这些层。
Dense层就是所谓的全连接神经网络层,简称全连接层。全连接层中的每个神经元与其前一层的所有神经元进行全连接。
Dense 实现以下操作: output = activation(dot(input, kernel) + bias) 其中 activation 是按逐个元素计算的激活函数,kernel 是由网络层创建的权值矩阵,以及 bias 是其创建的偏置向量 (只在 use_bias 为 True 时才有用)。
将激活函数应用于输出。输入信号进入神经元后进行的运算处理。
sigmoid、tanh、ReLU、softplus的对比曲线如下图所示:
激活函数可以通过设置单独的激活层Activation实现,也可以在构造层对象时通过传递 activation 参数实现:
Dropout在训练中每次更新时,将输入单元的按比率随机设置为0,这有助于防止过拟合。未设置为0的输入将按1 /(1-rate)放大,以使所有输入的总和不变。
请注意,仅当训练设置为True时才应用Dropout层,以便在推理过程中不会丢弃任何值。 使用model.fit时,训练将自动适当地设置为True。
将输入展平。不影响批量大小。注意:如果输入的形状是(batch,)没有特征轴,则展平会增加通道尺寸,而输出的形状是(batch, 1)。
将输入重新调整为特定的尺寸
将任意表达式封装为Layer对象。在Lambda层,以便在构造模型时可以使用任意TensorFlow函数。 Lambda层最适合简单操作或快速实验。 Lambda层是通过序列化Python字节码来保存的。
使用覆盖值覆盖序列,以跳过时间步。
对于输入张量的每一个时间步(张量的第一个维度),如果所有时间步中输入张量的值与mask_value相等,则将在所有下游层中屏蔽(跳过)该时间步。如果任何下游层不支持覆盖但仍然收到此类输入覆盖信息,会引发异常。
举例说明:
Embedding 是一个将离散变量转为连续向量表示的一个方式。该层只能用作模型中的第一层。
Embedding 有以下3个主要目的: 在 embedding 空间中查找最近邻,这可以很好的用于根据用户的兴趣来进行推荐。 作为监督性学习任务的输入。 用于可视化不同离散变量之间的关系.
举例说明:
输出结果:
由维基网络的介绍我们可以得知,卷积是一种定义在两个函数(𝑓跟𝑔)上的数学操作,旨在产生一个新的函数。那么𝑓和𝑔的卷积就可以写成𝑓∗𝑔,数学定义如下:
对应到不同方面,卷积可以有不同的解释:𝑔 既可以看作我们在深度学习里常说的核(Kernel),也可以对应到信号处理中的滤波器(Filter)。而 𝑓 可以是我们所说的机器学习中的特征(Feature),也可以是信号处理中的信号(Signal)。f和g的卷积 (𝑓∗𝑔)就可以看作是对𝑓的加权求和。
一维时域卷积操作:
二维图像卷积操作:
卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。
一维卷积层(即时域卷积),用以在一维输入信号上进行邻域滤波。
举例说明:
结果输出:
2D 卷积层 (例如对图像的空间卷积)。
举例说明:
结果输出:
3D卷积层(例如体积上的空间卷积)
举例说明:
结果输出:
深度可分离1D卷积。该层执行分别作用在通道上的深度卷积,然后是混合通道的逐点卷积。 如果use_bias为True并提供了一个偏差初始值设定项,则它将偏差向量添加到输出中。 然后,它可选地应用激活函数以产生最终输出。
深度可分离的2D卷积。可分离的卷积包括首先执行深度空间卷积(它分别作用于每个输入通道),然后是点向卷积,它将混合所得的输出通道。 depth_multiplier参数控制在深度步骤中每个输入通道生成多少个输出通道。
直观上,可分离的卷积可以理解为将卷积内核分解为两个较小内核的一种方式,或者是Inception块的一种极端版本。
转置卷积层 (有时被成为反卷积)。对转置卷积的需求一般来自希望使用 与正常卷积相反方向的变换,将具有卷积输出尺寸的东西 转换为具有卷积输入尺寸的东西, 同时保持与所述卷积相容的连通性模式。
池化层是模仿人的视觉系统对数据进行降维,用更高层次的特征表示图像。实施池化的目的:降低信息冗余;提升模型的尺度不变性、旋转不变性。 防止过拟合。
通常有最大池化层,平均池化层。
池化层有三种形态:1D 用于一维数据,2D 一般用于二维图像数据,3D 带时间序列数据的图像数据
循环神经网络(Recurrent Neural Network, 简称 RNN),循环神经网络的提出便是基于记忆模型的想法,期望网络能够记住前面出现的特征,并依据特征推断后面的结果,而且整体的网络结构不断循环,因此得名为循环神经网络。
长短期记忆网络(Long-Short Term Memory, LSTM )论文首次发表于1997年。由于独特的设计结构,LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。
举例说明:
结果输出:
GRU 门控循环单元- Cho et al. 2014.
在LSTM中引入了三个门函数:输入门、遗忘门和输出门来控制输入值、记忆值和输出值。而在GRU模型中只有两个门:分别是更新门和重置门。与LSTM相比,GRU内部少了一个”门控“,参数比LSTM少,但是却也能够达到与LSTM相当的功能。考虑到硬件的计算能力和时间成本,因而很多时候我们也就会选择更加”实用“的GRU。
举例说明:
结果输出:
循环神经网络层基类。
关于指定 RNN 初始状态的说明
您可以通过使用关键字参数 initial_state 调用它们来符号化地指定 RNN 层的初始状态。 initial_state 的值应该是表示 RNN 层初始状态的张量或张量列表。
可以通过调用带有关键字参数 states 的 reset_states 方法来数字化地指定 RNN 层的初始状态。 states 的值应该是一个代表 RNN 层初始状态的 Numpy 数组或者 Numpy 数组列表。
关于给 RNN 传递外部常量的说明
可以使用 RNN. call (以及 RNN.call)的 constants 关键字参数将“外部”常量传递给单元。 这要求 cell.call 方法接受相同的关键字参数 constants。 这些常数可用于调节附加静态输入(不随时间变化)上的单元转换,也可用于注意力机制。
举例说明:
在训练模型之前,我们需要配置学习过程,这是通过compile方法完成的。
他接收三个参数:优化器 opt
‘肆’ 如何用MATLAB神经网络工具箱创建BP神经网络模型
1. 常用的前馈型BP网络的转移函数有logsig,tansig,有时也会用到线性函数purelin。当网络的最后一层采用曲线函数时,输出被限制在一个很小的范围内,如果采用线性函数则输出可为任意值。以上三个函数是BP网络中最常用到的函数,但是如果需要的话你也可以创建其他可微的转移函数。
2. 在BP网络中,转移函数可求导是非常重要的,tansig、logsig和purelin都有对应的导函数dtansig、dlogsig和dpurelin。为了得到更多转移函数的导函数,可以带字符"deriv"的转移函数:tansig('deriv')
‘伍’ 手机上运行的深度神经网络模型-MobileNet
文章引用自《 从MobileNet看轻量级神经网络的发展 》,详情请点击原文观看
前 言
随着深度学习的火热,计算机视觉领域内的卷积神经网络模型也层出不穷。从1998年的LeNet,到2012年引爆深度学习热潮的AlexNet,再到后来2014年的VGG,2015年的ResNet,深度学习网络模型在图像处理中应用的效果越来越好。神经网络体积越来越大,结构越来越复杂,预测和训练需要的硬件资源也逐步增多,往往只能在高算力的服务器中运行深度学习神经网络模型。移动设备因硬件资源和算力的限制,很难运行复杂的深度学习网络模型。
深度学习领域内也在努力促使神经网络向小型化发展。在保证模型准确率的同时体积更小,速度更快。到了2016年直至现在,业内提出了SqueezeNet、ShuffleNet、NasNet、MnasNet以及MobileNet等轻量级网络模型。这些模型使移动终端、嵌入式设备运行神经网络模型成为可能。而MobileNet在轻量级神经网络中较具代表性。
谷歌在2019年5月份推出了最新的MobileNetV3。新版MobileNet使用了更多新特性,使得MobileNet非常具有研究和分析意义,本文将对MobileNet进行详细解析。
MobileNet的优势
MobileNet网络拥有更小的体积,更少的计算量,更高的精度。在轻量级神经网络中拥有极大的优势。
1
更小的体积
MobileNet相比经典的大型网络,参数量明显更少,参数量越少模型体积越小。
2
更少的计算量
MobileNet优化网络结构使模型计算量成倍下降。
3
更高的准确率
MobileNet凭借网络结构优化,在更少的参数及更少的计算量情况下,网络精度反而超过了部分大型神经网络。在最新的MobileNetV3-Large中,实现ImageNet数据集Top1准确率达到75.2%。
4
更快的速度
使用Google Pixel-1手机测试,MobileNet各版本都能保持运行时间在120ms以下,最新版MobileNetV3-Large运行时间达到66ms,参数量和计算量更低的MobileNetV3-Small更是能达到22ms;GoogleNet运行速度约为250ms,而VGG-16由于一次性需要加载至内存的空间已超过500MB,手机系统会报内存溢出错误导致无法运行。
5
多种应用场景
MobileNet可以在移动终端实现众多的应用,包括目标检测,目标分类,人脸属性识别和人脸识别等。
MobileNet各版本介绍
1
MobileNetV1网络结构
整个网络不算平均池化层与softmax层,共28层;
在整个网络结构中步长为2的卷积较有特点,卷积的同时充当下采样的功能;
第一层之后的26层都为深度可分离卷积的重复卷积操作;
每一个卷积层(含常规卷积、深度卷积、逐点卷积)之后都紧跟着批规范化和ReLU激活函数;
最后一层全连接层不使用激活函数。
2
MobileNetV2网络结构
MobileNetV2中主要引入线性瓶颈结构和反向残差结构。
MobileNetV2网络模型中有共有17个Bottleneck层(每个Bottleneck包含两个逐点卷积层和一个深度卷积层),一个标准卷积层(conv),两个逐点卷积层(pw conv),共计有54层可训练参数层。MobileNetV2中使用线性瓶颈(Linear Bottleneck)和反向残差(Inverted Resials)结构优化了网络,使得网络层次更深了,但是模型体积更小,速度更快了。
3
MobileNetV3网络结构
MobileNetV3分为Large和Small两个版本,Large版本适用于计算和存储性能较高的平台,Small版本适用于硬件性能较低的平台。
Large版本共有15个bottleneck层,一个标准卷积层,三个逐点卷积层。
Small版本共有12个bottleneck层,一个标准卷积层,两个逐点卷积层。
MobileNetV3中引入了5×5大小的深度卷积代替部分3×3的深度卷积。引入Squeeze-and-excitation(SE)模块和h-swish(HS)激活函数以提高模型精度。结尾两层逐点卷积不使用批规范化(Batch Norm),MobileNetV3结构图中使用NBN标识。
(图片来源https://arxiv.org/pdf/1905.02244.pdf)
网络结构上相对于MobileNetV2的结尾部分做了优化,去除三个高阶层,如上图所示。去除后减少了计算量和参数量,但是模型的精度并没有损失。
值得一提的是,不论是Large还是Small版本,都是使用神经架构搜索(NAS)技术生成的网络结构。
4
MobileNet各版本特性
MobileNet实现计算量减小、参数量减少的同时保证了较高的准确率,这和其拥有的特性息息相关:
MobileNetV1提出的特性
MobileNetV2提出的特性
MobileNetV3提出的特性
MobileNet各个版本拥有的特性汇总
下文将对上表中的各个特性详细阐述。
MobileNet的特性详解
1
深度可分离卷积
从MobileNetV1开始,到V2、V3的线性瓶颈结构都大量使用了深度可分离卷积。
深度可分离卷积(Depthwise Separable Convolution)是一种卷积结构。它是由一层深度卷积(Depthwise convolution)与一层逐点卷积(Pointwise Convolution)组合而成的,每一层卷积之后都紧跟着批规范化和ReLU激活函数。跟标准卷积的区别就是精度基本不变的情况下,参数与计算量都明显减少。
深度卷积
深度卷积(Depthwise convolution, DW)不同于常规卷积操作,深度卷积中一个卷积核只有一维,负责一个通道,一个通道只被一个卷积核卷积;常规卷积每个卷积核的维度与输入维度相同,每个通道单独做卷积运算后相加。
以一张5x5x3(长和宽为5,RGB3通道)的彩色图片举例。每层深度卷积卷积核的数量与上一层的通道数相同(通道和卷积核一一对应)。设padding=1,stride=1,一个三通道的图像经过运算后生成了3个特征图,如下图所示:
深度卷积完成后的输出特征图通道数与输入层的通道数相同,无法扩展通道数。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的特征信息。因此需要逐点卷积来将生成的特征图进行组合生成新的特征图。
逐点卷积
逐点卷积(Pointwise Convolution, PW)的运算与标准卷积运算非常相似。
逐点卷积卷积核大小为1×1xM(M为输入数据的维度),每次卷积一个像素的区域。逐点卷积运算会将上一层的特征图在深度方向上进行加权组合,生成新的特征图,新的特征图的大小与输入数据大小一致;然后组合各通道的特征图,以较少的计算量进行降维或升维操作(改变输出数据的维度)。
以一张5x5x3(长和宽为5,RGB3通道)的彩色图片举例,使用4个1x1x3的逐点卷积核进行卷积,逐点卷积运算后生成了4个特征图。这个例子是使用逐点卷积进行升维的操作,特征图从5x5x3 升维到5x5x4。如下图所示:
深度可分离卷积结构解析
将深度卷积和逐点卷积组成深度可分离卷积后的示意图,如下图所示:
首先进行深度卷积操作,得出的特征图各通道之间是不关联的。接着进行逐点卷积把深度卷积输出的特征图各通道关联起来。
深度可分离卷积使用了更小的空间代价(参数减少)和更少的时间代价(计算量更少)实现了标准卷积层一样的效果(提取特征)。
一般的设Df为输入特征图边长,Dk为卷积核边长,特征图和卷积核均为长宽一致,输入通道数为M,输出通道数为N,则:
标准卷积计算量为:Df×Df×Dk×Dk×M×N
深度卷积的计算量为:Df×Df×Dk×Dk×M
逐点卷积的计算量为:Df×Df×M×N
上图所示实现输入特征图大小为5×5×3,输出特成图大小为5×5×4,设padding=1,stride=1,深度卷积卷积核大小为3×3,标准卷积也使用3×3尺寸卷积核。实现相同的卷积效果,参数量(不包含偏置)与计算量对比如下表所示:
深度可分离卷积的演变
事实上深度可分离卷积不是在MobileNetV1中第一次提出的,而是在2016年由谷歌的Xception网络结构中提出的。MobileNetV1在Xception的基础上,对深度可分离卷积进行了改进,做到了计算量与参数量的下降:
假定M为输入层的通道数,N为输出层的通道数。
Xcenption的深度可分离卷积是由输入参数开始,使用1x1xMxN卷积将输入层的通道数转换为目标通道数,再通过3x3x1卷积核对每个通道进行卷积,每次卷积过后使用ReLU进行激活。
MobileNetV1的深度可分离卷积则是先使用3x3x1xM对输入层的每个通道分别卷积,之后通过1x1xMxN将输入层通道数转换为输出层通道数,每次卷积过后做一次批规范化操作,再使用ReLU进行激活。
这里我们使用MobileNetV1网络结构的第一个深度可分离卷积层来举例,输入层维度为112x112x32,输出层维度为112x112x64,Xception与MobileNet的深度可分离卷积的计算量与参数个数对比如下表:
由此可知将PW卷积与DW卷积的顺序调整后,优化了网络的空间复杂度和时间复杂度。
2
宽度因子
MobileNet本身的网络结构已经比较小并且执行延迟较低,但为了适配更定制化的场景,MobileNet提供了称为宽度因子(Width Multiplier)的超参数给我们调整。宽度因子在MobileNetV1、V2、V3都可以运用。
通过宽度因子,可以调整神经网络中间产生的特征的大小,调整的是特征数据通道数大小,从而调整了运算量的大小。
宽度因子简单来说就是新网络中每一个模块要使用的卷积核数量相较于标准的MobileNet比例。对于深度卷积结合1x1方式的卷积核,计算量为:
算式中α即为宽度因子,α常用的配置为1,0.75,0.5,0.25;当α等于1时就是标准的MobileNet。通过参数α可以非常有效的将计算量和参数数量约减到α的平方倍。
下图为MobileNetV1使用不同α系数进行网络参数的调整时,在ImageNet上的准确率、计算量、参数数量之间的关系(每一个项中最前面的数字表示α的取值)。
(数据来源https://arxiv.org/pdf/1704.04861.pdf)
可以看到当输入分辨率固定为224x224时,随着宽度因子的减少,模型的计算量和参数越来越小。从上表可以看到, 0.25 MobileNet的正确率比标准版1.0MobileNet低20%,但计算量和参数量几乎只有标准版1.0MobileNet计算量、参数量的10%!对于计算资源和存储资源都十分紧张的移动端平台,可以通过α宽度因子调节网络的餐数量是非常实用的,在真正使用时我们可以按需调整α宽度因子达到准确率与性能的平衡。
3
分辨率因子
MobileNet还提供了另一个超参数分辨率因子(Resolution Multiplier)供我们自定义网络结构,分辨率因子同样在MobileNetV1、V2、V3都可以运用。
分辨率因子一般用β来指代,β的取值范围在(0,1]之间,是作用于每一个模块输入尺寸的约减因子,简单来说就是将输入数据以及由此在每一个模块产生的特征图都变小了,结合宽度因子α,深度卷积结合1x1方式的卷积核计算量为:
下图为MobileNetV1使用不同的β系数作用于标准MobileNet时,在ImageNet上对精度和计算量的影响(α固定1.0)
(数据来源https://arxiv.org/pdf/1704.04861.pdf)
上图中的 224、192、160、128 对应的分辨率因子分别为 1、 6/7、5/7、4/7。
β=1时,输入图片的分辨率为224x224,卷积后的图像大小变化为: 224x224 、112x112、56x56、28x28、14x14、7x7。
β= 6/7时,输入图片的分辨率为192x192,卷积后各层特征图像大小变化为:192x192、96x96、48x48、24x24、12x12、6x6。
卷积特征图像的大小变化不会引起参数量的变化,只改变模型M-Adds计算量。上图中 224分辨率模型测试ImageNet数据集准确率为70.6%,192分辨率的模型准确率为69.1%,但是M-Adds计算量减少了151M,对移动平台计算资源紧张的情况下,同样可以通过β分辨率因子调节网络输入特征图的分辨率,做模型精度与计算量的取舍。
4
规范化
深度学习中的规范化操作(Normalization),有助于加快基于梯度下降法或随机梯度下降法模型的收敛速度,提升模型的精度,规范化的参数能够提升模型泛化能力,提高模型的可压缩性。
按照规范化操作涉及对象的不同可以分为两大类,一类是对输入值进行规范化操作,比如批规范化(Batch Normalization)、层规范化(Layer Normalization)、实例规范化(Instance Normalization)、组规范化(Group Normalization)方法都属于这一类。另外一类是对神经网络中参数进行规范化操作,比如使用L0,L1范数。
批规范化
批规范化(Batch Normalization)几乎存在于MobileNetV1、V2、V3的每个卷积层的后面,目的是加快训练收敛速度,提升准确率。
批规范化是一种对数值的特殊函数变换方法,也就是说假设原始的某个数值是 x,套上一个起到规范化作用的函数,对规范化之前的数值 x 进行转换,形成一个规范化后的数值,即:
所谓规范化,是希望转换后的数值满足一定的特性,至于对数值具体如何变换,跟规范化目标有关,不同的规范化目标导致具体方法中函数所采用的形式不同。通过自适应的重新参数化的方法,克服神经网络层数加深导致模型难以训练的问题。
参数规范化
参数规范化(Weight Normalization, WN)是规范化的一种, 通过人为的设定稀疏算法,去除模型中多余的参数(置为0)使得模型参数稀疏化,可以通过L1范式实现。
参数规范化是防止模型过分拟合训练数据。当训练一批样本的时候,随着训练的推移模型会越来越趋向于拟合样本数据。因为参数太多,会导致模型复杂度上升,容易过拟合。
需要保证模型"简单"的基础上最小化训练误差,这样得到的参数才具有好的泛化性能(也就是测试误差也小),而模型"简单"就是通过规则函数来实现的。
如上图所示,左侧分类明显的是欠拟合,模型并没有能够拟合数据。中间图示为合适的拟合,右边图示是过拟合,模型在训练样本中拟合度是很好的,但是却违背了特征分类规律,在新的测试样本中表现糟糕,影响模型的泛化能力。显然右侧模型在训练是受到额外参数干扰。参数规则化能够使参数稀疏,减少额外参数的干扰,提高泛化能力。
模型拥有稀疏的参数(模型中有大量参数为0),也有利于通过压缩算法压缩模型的大小。
5
线性瓶颈
线性瓶颈英文为Linear Bottleneck,是从Bottleneck结构演变而来的,被用于MobileNetV2与V3。
Bottleneck结构首次被提出是在ResNet网络中。该结构第一层使用逐点卷积,第二层使用3×3大小卷积核进行深度卷积,第三层再使用逐点卷积。MobileNet中的瓶颈结构最后一层逐点卷积使用的激活函数是Linear,所以称其为线性瓶颈结构(Linear Bottleneck)。线性瓶颈结构有两种,第一种是步长为1时使用残差结构,第二种是步长为2时不使用残差结构。
其中输入通道数为M,扩大倍数系数为T。T的值为大于0 的正数,当 0<T<1时,第一层逐点卷积起到的作用是降维。当 1<T时,第一层逐点卷积起到的作用是升维。
第二层为深度卷积,输入通道数 = 输出通道数 = M×T。
第三层为逐点卷积,作用是关联深度卷积后的特征图并输出指定通道数N。
线性瓶颈结构相对标准卷积能够减少参数数量,减少卷积计算量。从空间和时间上优化了网络。
6
反向残差
MobileNetV2中以ResNet的残差(Resials)结构为基础进行优化,提出了反向残差(Inverted Resials)的概念,之后也同样运用与MobileNetV3中。
ResNet中提出的残差结构解决训练中随着网络深度增加而出现的梯度消失问题,使反向传播过程中深度网络的浅层网络也能得到梯度,使浅层网络的参数也可训练,从而增加特征表达能力。
ResNet的残差结构实际是在线性瓶颈结构的基础上增加残差传播。如下图所示:
ResNet中的残差结构使用第一层逐点卷积降维,后使用深度卷积,再使用逐点卷积升维。
MobileNetV2版本中的残差结构使用第一层逐点卷积升维并使用Relu6激活函数代替Relu,之后使用深度卷积,同样使用Relu6激活函数,再使用逐点卷积降维,降维后使用Linear激活函数。这样的卷积操作方式更有利于移动端使用(有利于减少参数与M-Adds计算量),因维度升降方式与ResNet中的残差结构刚好相反,MobileNetV2将其称之为反向残差(Inverted Resials)。
7
5x5 的深度卷积
MobileNetV3中,深度卷积大量使用5x5大小的卷积核。这是因为使用神经结构搜索(NAS)技术计算出的MobileNetV3网络结构的过程中,发现了在深度卷积中使用5x5大小的卷积核比使用3x3大小的卷积核效果更好,准确率更高。关于NAS技术将会在下文的单独章节中做介绍。
8
Squeeze-and-excitation 模块
Squeeze-and-Excitation模块(简称SE模块)的首次提出是在2017年的Squeeze-and-Excitation Networks(SENet)网络结构中,在MNasNet中进行了改进,之后在MobileNetV3中大量使用。研究人员期望通过精确的建模卷积特征各个通道之间的作用关系来改善网络模型的表达能力。为了达到这个期望,提出了一种能够让网络模型对特征进行校准的机制,使得有效的权重大,无效或效果小的权重小的效果,这就是SE模块。
(图片来源https://arxiv.org/pdf/1905.02244.pdf)
如上图,MobileNetV3的SE模块被运用在线性瓶颈结构最后一层上,代替V2中最后的逐点卷积,改为先进行SE操作再逐点卷积。这样保持了网络结构每层的输入和输出,仅在中间做处理,类似于软件开发中的钩子。
SE模块结构详解
下图表示一个SE 模块。主要包含Squeeze和Excitation两部分。W,H表示特征图宽,高。C表示通道数,输入特征图大小为W×H×C。
压缩(Squeeze)
第一步是压缩(Squeeze)操作,如下图所示
这个操作就是一个全局平均池化(global average pooling)。经过压缩操作后特征图被压缩为1×1×C向量。
激励(Excitation)
接下来就是激励(Excitation)操作,如下图所示
由两个全连接层组成,其中SERatio是一个缩放参数,这个参数的目的是为了减少通道个数从而降低计算量。
第一个全连接层有C*SERatio个神经元,输入为1×1×C,输出1×1×C×SERadio。
第二个全连接层有C个神经元,输入为1×1×C×SERadio,输出为1×1×C。
scale操作
最后是scale操作,在得到1×1×C向量之后,就可以对原来的特征图进行scale操作了。很简单,就是通道权重相乘,原有特征向量为W×H×C,将SE模块计算出来的各通道权重值分别和原特征图对应通道的二维矩阵相乘,得出的结果输出。
这里我们可以得出SE模块的属性:
参数量 = 2×C×C×SERatio
计算量 = 2×C×C×SERatio
总体来讲SE模块会增加网络的总参数量,总计算量,因为使用的是全连接层计算量相比卷积层并不大,但是参数量会有明显上升,所以MobileNetV3-Large中的总参数量比MobileNetV2多了2M。
MobileNetV3中的SE模块
SE模块的使用是很灵活的,可以在已有网络上添加而不打乱网络原有的主体结构。
ResNet中添加SE模块形成SE-ResNet网络,SE模块是在bottleneck结构之后加入的,如下图左边所示。
MobileNetV3版本中SE模块加在了bottleneck结构的内部,在深度卷积后增加SE块,scale操作后再做逐点卷积,如上图右边所示。MobileNetV3版本的SERadio系数为0.25。使用SE模块后的MobileNetV3的参数量相比MobileNetV2多了约2M,达到5.4M,但是MobileNetV3的精度得到了很大的提升,在图像分类和目标检测中准确率都有明显提升。
9
h-swish激活函数
MobileNetV3中发现swish激活函数能够有效提高网络的精度,但是swish的计算量太大了,并不适合轻量级神经网络。MobileNetV3找到了类似swish激活函数但是计算量却少很多的替代激活函数h-swish(hard version of swish)如下所示:
sigmoid、h-sigmoid、swish、h-swish激活函数的比较:
(图片来源https://arxiv.org/pdf/1905.02244.pdf)
这种非线性在保持精度的情况下带来了很多优势,首先ReLU6在众多软硬件框架中都可以实现,其次量化时避免了数值精度的损失,运行快。这一非线性改变将模型的延时增加了15%。但它带来的网络效应对于精度和延时具有正向促进,剩下的开销可以通过融合非线性与先前层来消除。
‘陆’ 复杂神经网络模型用什么软件
bp神经网络能用MATLAB,
理论上编程语言都可以,比如VB,C语言,过程也都是建模、量化、运算及结果输出(图、表),但是matlab发展到现在,集成了很多的工具箱,所以用的最为广泛,用其他的就得是要从源码开发入手了。
bp神经网络是一种算法,只要是算法就可以用任何软件工具,只要编译器或者解释器支持,c,c++,python,来进行实现,只是实现时的复杂程度有区别而已
‘柒’ 神经软件怎么用
第一步:数据导入第二步:使用神经网络工具箱构建模型
神经网络软件用于仿真、研究、开发和应用人工神经网络,从生物神经网络改编的软件概念,在某些情况下还可以用于更广泛的自适应系统,例如人工智能和机器学习
常用的人工神经网络模拟器包括斯图加特神经网络模拟器(SNNS)、紧急和神经实验室。
‘捌’ matlab神经网络工具箱怎么效果好
导入数据:选择合适的数据,一定要选数值矩阵形式
在这里插入图片描述在这里插入图片描述
进行训练
在这里插入图片描述
接下来就点next,选择输入输出,Sample are是选择以行还是列放置矩阵的,注意调整
在这里插入图片描述
接下来一直next,在这儿点train
在这里插入图片描述
查看结果
在这里插入图片描述
导出代码:再点next,直到这个界面,先勾选下面的,再点Simple Script生成代码
在这里插入图片描述
使用训练好的神经网络进行预测
使用下方命令,z是需要预测的输入变量,net就是训练好的模型
在这里插入图片描述
再将结果输出成excel就行啦
在这里插入图片描述
打开CSDN,阅读体验更佳
使用MATLAB加载训练好的caffe模型进行识别分类_IT远征军的博客-CSDN...
在进行下面的实验前,需要先对数据进行训练得到caffemodel,然后再进行分类识别 c_demo.m function [scores, maxlabel] = c_demo(im, use_gpu) % Add caffe/matlab to you Matlab search PATH to use matcaffe if exist('/home/...
继续访问
MATLAB调用训练好的KERAS模型_LzQuarter的博客
下载了链接中的“kerasimporter.mlpkginstall”文件后,在matlab内用左侧的文件管理系统打开会进入一个页面,在该页面的右上角有安装的按钮,如果之前安装一直失败,可以通过这个安装按钮的下拉选项选择仅下载 下载还是有可能要用到VPN,但是相比...
继续访问
最新发布 matlab神经网络预测数据,matlab神经网络工具箱
Matlab语言是MathWorks公司推出的一套高性能计算机编程语言,集数学计算、图形显示、语言设计于一体,其强大的扩展功能为用户提供了广阔的应用空问。它附带有30多个工具箱,神经网络工具箱就是其中之一。谷歌人工智能写作项目:神经网络伪原创。
继续访问
matlab神经网络工具箱系统预测
matlab神经网络工具箱系统预测 有原始数据 根据原始数据预测未来十年内的数据
matlab预测控制工具箱
matlab预测控制工具箱,在学习预测控制的过程中翻译的matlab自带的示例,希望对大家有所帮助 matlab预测控制工具箱,在学习预测控制的过程中翻译的matlab自带的示例,希望对大家有所帮助
用matlab做bp神经网络预测,神经网络预测matlab代码
我觉得一个很大的原因是你预测给的输入范围(2014-)超出了训练数据的输入范围(2006-2013),神经网络好像是具有内插值特性,不能超出,你可以把输入变量-时间换成其他的变量,比如经过理论分析得出的某些影响因素,然后训练数据要包括大范围的情况,这样可以保证预测其他年份的运量的时候,输入变量不超出范围,最后预测的时候给出这几个影响因素的值,效果会好一点。输出层是个purelin,线性组合后的输出层输出当然也全是几乎相同的了。输出层是个purelin,线性组合后的输出层输出当然也全是几乎相同的了。
继续访问
BP神经网络预测实例(matlab代码,神经网络工具箱)
目录辛烷值的预测matlab代码实现工具箱实现 参考学习b站: 数学建模学习交流 bp神经网络预测matlab代码实现过程 辛烷值的预测 【改编】辛烷值是汽油最重要的品质指标,传统的实验室检测方法存在样品用量大,测试周期长和费用高等问题,不适用于生产控制,特别是在线测试。近年发展起来的近红外光谱分析方法(NIR),作为一种快速分析方法,已广泛应用于农业、制药、生物化工、石油产品等领域。其优越性是无损检测、低成本、无污染,能在线分析,更适合于生产和控制的需要。实验采集得到50组汽油样品(辛烷值已通过其他方法测
继续访问
用matlab做bp神经网络预测,matlab人工神经网络预测
ylabel('函数输出','fontsize',12);%画出预测结果误差图figureplot(error,'-*')title('BP网络预测误差','fontsize',12)ylabel('误差','fontsize',12)xlabel('样本','fontsize',12)。三、训练函数与学习函数的区别函数的输出是权值和阈值的增量,训练函数的输出是训练好的网络和训练记录,在训练过程中训练函数不断调用学习函数修正权值和阈值,通过检测设定的训练步数或性能函数计算出的误差小于设定误差,来结束训练。.
继续访问
matlab训练神经网络模型并导入simulink详细步骤
之前的神经网络相关文章: Matlab-RBF神经网络拟合数据 Matlab RBF神经网络及其实例 4.深度学习(1) --神经网络编程入门 本文介绍一下怎么把训练好的神经网络导入到simulink并使用,假定有两个变量,一个输出变量,随机生成一点数据 x1 = rand(1000,1);x2 = rand(1000,1);x = [x1 x2];y = rand(1000,1); 在App里面找到神经网络工具箱 点击Next 选择对应的数据,注意选择好对应的输入和输出,还
继续访问
用matlab做bp神经网络预测,matlab神经网络怎么预测
它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。Network可以看出,你的网络结构是两个隐含层,2-3-1-1结构的网络,算法是traindm,显示出来的误差变化为均方误差值mse。达到设定的网络精度0.001的时候,误差下降梯度为0.0046,远大于默认的1e-5,说明此时的网络误差仍在快速下降,所以可以把训练精度目标再提高一些,比如设为0.0001或者1e-5。如果你所选用的激活函数是线性函数,那么就可以先把输出的表达式写出来,即权向量和输入的矩阵乘积。
继续访问
matlab训练模型、导出模型及VC调用模型过程详解
MATLAB是美国MathWorks公司出品的商业数学软件,为算法开发、数据可视化、数据分析以及数值计算等提供了高级计算语言和交互式环境。随着人工智能的崛起,MATLAB也添加了自己的机器学习工具包,只需要很少的代码或命令就能完成模型训练和测试的过程,训练好的模型也能方便的导出,供VC等调用。本文主要介绍模型训练、导出和调用的整个过程。 软件版本: VC2015,matlab2018a ...
继续访问
matlab神经网络预测模型,matlab人工神经网络预测
谷歌人工智能写作项目:小发猫matlab带有神经网络工具箱,可直接调用,建议找本书看看,或者MATLAB论坛找例子常见的神经网络结构。核心调用语句如下:%数据输入%选连样本输入输出数据归一化[inputn,inputps]=mapminmax(input_train);[outputn,outputps]=mapminmax(output_train);%%BP网络训练%%初始化网络结构net=newff(inputn,outputn,[88]);net.trainParam.epochs=100;=0.0
继续访问
在Matlab中调用pytorch上训练好的网络模型
在Matlab中调用pytorch上训练好的网络模型
继续访问
MATLAB_第二篇神经网络学习_BP神经网络
BP神经网络代码实现1. BP神经网络的简介和结构参数1.1 BP神经网络的结构组成1.2 BP神经网络训练界面的参数解读 非常感谢博主wishes61的分享. 1. BP神经网络的简介和结构参数 一种按照误差逆向传播算法训练的多层前馈神经网络用于预测BP神经网络的计算过程:由正向计算过程和反向计算过程组成。 正向传播过程,输入模式从输入层经隐单元层逐层处理,并转向输出层,每一层神经元的状态只影响下一层神经元的状态。 如果在输出层不能得到期望的输出,则转入反向传播,将误差信号沿原来的连接通路返回,通过修改各
继续访问
MATLAB神经网络拟合回归工具箱Neural Net Fitting的使用方法
本文介绍MATLAB软件中神经网络拟合(Neural Net Fitting)工具箱的具体使用方法~
继续访问
灰色预测工具箱matlab,Matlab灰色预测工具箱——走过数模
2009-07-02 23:05灰色预测几乎是每年数模培训必不可少的内容,相对来说也是比较简单,这里写了四个函数,方便在Matlab里面调用,分别是GM(1,1),残差GM(1,1),新陈代谢GM(1,1),Verhust自己写得难免有所疏忽,需要的朋友自己找本书本来试验一下。。Gm(1,1)function [px0,ab,rel]=gm11(x0,number)%[px0,ab,rel]=gm...
继续访问
matlab利用训练好的BP神经网络来预测新数据(先保存网络,再使用网络)
1,保存网络。save ('net') % net为已训练好的网络,这里把他从workspace保存到工作目录,显示为net.mat文档。 2,使用网络。load ('net') % net为上面保存的网络,这里把他下载到workspace。y_predict = sim(...
继续访问
数学建模学习(79):Matlab神经网络工具箱使用,实现多输入多输出预测
Matlab神经网络工具箱实现,实现多输入多输出预测
继续访问
热门推荐 如何利用matlab做BP神经网络分析(包括利用matlab神经网络工具箱)
利用MATLAB 进行BP神经网络的预测(含有神经网络工具箱) 最近一段时间在研究如何利用预测其销量个数,在网上搜索了一下,发现了很多模型来预测,比如利用回归模型、时间序列模型,GM(1,1)模型,可是自己在结合实际的工作内容,发现这几种模型预测的精度不是很高,于是再在网上进行搜索,发现神经网络模型可以来预测,并且有很多是结合时间序列或者SVM(支持向量机)等组合模型来进...
继续访问
bp神经网络预测案例python_详细BP神经网络预测算法及实现过程实例
1.具体应用实例。根据表2,预测序号15的跳高成绩。表2国内男子跳高运动员各项素质指标序号跳高成绩()30行进跑(s)立定三级跳远()助跑摸高()助跑4—6步跳高()负重深蹲杠铃()杠铃半蹲系数100(s)抓举()12.243.29.63.452.151402.811.05022.333.210.33.752.21203.410.97032.243.09.03.52.21403.511.4504...
继续访问
如何调用MATLAB训练神经网络生成的网络进行预测
如何调用MATLAB训练神经网络生成的网络问题引出知识准备代码注解 问题引出 如何存储和调用已经训练好的神经网络。 本人前几天在智能控制学习的过程中也遇到了这样的问题,在论坛中看了大家的回复,虽然都提到了关键的两个函数“save”和“load”,但或多或少都简洁了些,让人摸不着头脑(呵呵,当然也可能是本人太菜)。通过不断调试,大致弄明白这两个函数对神经网络的存储。下面附上实例给大家做个说明,希望对跟我有一样问题的朋友有所帮助。 知识准备 如果只是需要在工作目录下保到当前训练好的网络,可以在命令窗口 输入:s
继续访问
matlab训练好的模型怎么用
神经网络