深度 向手机端神经网络进发:MobileNet压缩指南
- 格式:doc
- 大小:20.09 KB
- 文档页数:13
在深度学习领域,模型压缩是一种非常重要的技术手段,它可以有效地降低深度神经网络的复杂度,从而在不影响模型性能的情况下减少模型的存储空间和计算量。
模型压缩技术主要包括剪枝、量化、知识蒸馏等方法,下面将详细介绍这些方法的使用方法。
剪枝是一种常用的模型压缩方法,其原理是通过去除网络中一些不重要的连接或节点来减小模型的大小。
在实际应用中,剪枝可以分为静态剪枝和动态剪枝两种。
静态剪枝是指在训练过程中对模型进行一次性的剪枝,而动态剪枝则是在训练过程中动态地对模型进行剪枝。
对于静态剪枝来说,其使用方法主要包括确定剪枝的策略和剪枝的实现。
确定剪枝的策略通常包括基于权重、梯度、信息熵等方法,而剪枝的实现则需要对模型的连接或节点进行相应的操作。
对于动态剪枝来说,其使用方法则是在模型训练的过程中动态地调整模型的连接或节点,以达到剪枝的目的。
量化是另一种常用的模型压缩方法,其原理是将模型中的参数从浮点数转换为定点数或低位浮点数,从而减少模型的存储空间和计算量。
在实际应用中,量化可以分为权重量化和激活量化两种。
权重量化是指将模型的权重参数进行量化,而激活量化则是将模型的激活值进行量化。
对于权重量化来说,其使用方法主要包括确定量化的策略和量化的实现。
确定量化的策略通常包括基于最大最小化、均匀量化、非均匀量化等方法,而量化的实现则需要对模型的权重参数进行相应的转换。
对于激活量化来说,其使用方法则是对模型的激活值进行量化,并在前向传播和反向传播过程中进行相应的计算。
知识蒸馏是一种新兴的模型压缩方法,其原理是通过将一个复杂的模型的知识传递给一个简单的模型,从而在不影响模型性能的情况下减小模型的大小。
在实际应用中,知识蒸馏的使用方法主要包括确定蒸馏的目标和实现知识的传递。
确定蒸馏的目标通常包括基于距离、相似度、信息熵等方法,而实现知识的传递则需要对复杂模型的知识进行提取并传递给简单模型。
除了上述介绍的方法之外,还有一些其他的模型压缩方法,如低秩分解、通道剪枝、深度分离等。
Mobilenet V1是由谷歌开发的一种轻量级的神经网络模型,旨在在移动设备和嵌入式设备上实现高效的实时图像识别。
它采用了一种深度可分离卷积的结构,以实现在资源受限的设备上运行,并且在识别精度方面仍然保持相当高的水平。
Mobilenet V1的模型结构主要包括以下几个方面:1. 输入层Mobilenet V1的输入层通常是一张彩色图像,其尺寸为224x224像素。
这是由于在图像识别任务中,通常会将图像缩放到统一的尺寸作为神经网络的输入,以便保持一致的处理方式。
2. 卷积层Mobilenet V1采用了深度可分离卷积的结构。
深度可分离卷积是一种特殊的卷积操作,将标准的卷积操作分为深度卷积和逐点卷积两部分。
这种结构能够显著减少参数数量和计算量,同时在保持识别精度的基础上实现模型的轻量化。
3. 激活函数在卷积层之后,Mobilenet V1使用了线性整流函数(ReLU)作为激活函数,以引入非线性变换并增强模型的表达能力。
线性整流函数能够将负值置零,并保持正值不变,从而将神经网络的激活范围限制在非负的部分,有助于缓解梯度消失问题。
4. 正则化层为了避免模型过拟合训练数据,Mobilenet V1通常在卷积层之后添加了批量归一化和Dropout等正则化层。
批量归一化能够加快模型收敛速度,减少梯度消失问题;Dropout则可以随机地将部分神经元输出置零,以减少神经元之间的依赖关系,从而提高模型的泛化能力。
5. 全局平均池化在卷积层之后,Mobilenet V1采用了全局平均池化,将卷积层的输出特征图转化为一个固定长度的特征向量。
全局平均池化能够减少模型的参数数量,降低过拟合的风险,同时使模型对输入图像的尺寸变化具有一定的鲁棒性。
6. 全连接层Mobilenet V1通过一个或多个全连接层将全局平均池化得到的特征向量映射到最终的输出类别。
全连接层通常包括一个或多个隐藏层和一个输出层,隐藏层通过激活函数对特征进行非线性变换,输出层则利用Softmax函数将隐藏层的得分转化为每个类别的概率值,从而实现对输入图像的分类识别。
为模型减减肥:谈谈移动嵌⼊式端的深度学习原⽂链接:本⽂为机器之⼼矽说专栏系列⽂章之⼀,对模型压缩进⾏了深度解读。
1. 为什么要为深度学习模型减肥随着深度学习的发展,神经⽹络模型也越来越复杂,常⽤的模型中 VGG 系列⽹络的计算量可以达到 30-40 GOP(1GOP=109 运算)。
这些神经⽹络通常运⾏在 GPU 上,但是如果我们要在移动/嵌⼊式端也实现深度学习,那么这样巨⼤的模型是绝对跑不动的。
移动/嵌⼊式端的计算能⼒往往只有桌⾯级 GPU 的 1/100 到 1/1000,换句话说在 GPU 上⼀秒 40 帧的深度学习 CV 算法在移动/嵌⼊式端⼀秒只有 0.04-0.4 帧,这样的性能会极⼤影响⽤户体验。
常⽤深度学习⽹络运算量在移动/嵌⼊式端跑深度学习模型,除了运⾏速度之外,能效⽐(energy efficiency)也是关键指标。
能效⽐指的是⼀次运算所需消耗的能量,它决定了移动/嵌⼊式端运⾏深度学习算法时电池能⽤多久。
能效⽐与深度学习模型息息相关,我们下⾯将会看到深度学习模型的⼤⼩会决定运⾏算法时的⽚外内存访问频率,从⽽决定了能效⽐。
2. 怎样的模型才能算「⾝材苗条」?正如我们减肥不仅要看体重还要看体脂率⼀样,为深度学习模型「减肥」时不仅要看模型计算量还要看模型⼤⼩。
模型计算量是衡量深度学习是否适合在移动或嵌⼊式端计算的最重要指标,通常⽤ GOP 单位来表⽰。
例如,流⾏的 ResNet-18 的计算量⼤约是 4 GOP,⽽ VGG-16 则为⼤约 31 GOP。
移动和嵌⼊式端的硬件计算能⼒有限,因此模型所需的计算量越⼤,则模型在移动端运⾏所需要的时间就越长。
为了能让使⽤深度学习的应⽤顺畅运⾏,模型运算量当然是越⼩越好。
除此之外,深度学习每次运算都是需要花费能量的,模型运算量越⼤则完成⼀次 inference 需要的能量也就越⼤,换句话说就是越费电。
在电池量有限的移动和嵌⼊式端,模型⼀次inference 所花费的能量必须精打细算,因此深度学习模型计算量不能太⼤。
模型压缩的方法
模型压缩指对于深度神经网络进行优化,减少其所需的计算资源和存储空间,使之能够在有限的硬件设备上运行和部署。
常用的模型压缩方法包括:
1. 参数下降:通过去除模型中冗余和不必要的参数,减少模型的大小和复杂度,较少计算量和存储光盘使用。
2. 知识蒸馏:将一个较为复杂的大模型所学习到的知识,通过训练一个较为简单的小模型来迁移,从而使得小型模型在满足一定精度要求的同时具有更高的计算效率。
3. 剪枝:通过去除一定数量的无用连接,来降低网络中的参数量和计算量。
剪枝方法包括结构剪枝、按照通道剪枝和按照元素剪枝等。
4. 量化:将网络中的参数和激活值从浮点数转换为定点数和整数,从而减少存储和计算量。
量化主要包括定点量化和二值量化。
5. 分享权重:将多个子网络的权重共享,从而减少网络的参数量和计算量。
以上是常见的模型压缩方法。
基于特征复用的卷积神经网络模型压缩方法作者:冀树伟杨喜旺黄晋英尹宁来源:《计算机应用》2019年第06期摘要:为了在不降低准确率的前提下,减小卷积神经网络模型的体积与计算量,提出一种基于特征复用的卷积神经网络压缩模块——特征复用单元(FR-unit)。
首先,针对不同类型的卷积神经网络结构,提出不同的优化方法;然后,在对输入特征图进行卷积操作后,将输入特征与输出特征进行结合;最后,将结合后的特征传递给下一层。
通过对低层特征的重复使用,使总的提取的特征数量不发生改变,以保证优化后的网络的准确率不会发生改变。
在CIFAR10数据集上进行验证,实验结果表明,优化后的VGG模型体积缩小为优化前的75.4%,预测时间缩短为优化前的43.5%;优化后的Resnet模型体积缩小为优化前的53.1%,预测时间缩短为优化前的60.9%,且在测试集上的准确率均未降低。
关键词:卷积神经网络;特征复用;网络加速;模型压缩中图分类号:TP183文献标志码:AAbstract: In order to reduce the volume and computational complexity of the convolutional neural network model without reducing the accuracy, a compression method of convolutional neural network model based on feature reuse unit called FR-unit (Feature-Reuse unit) was proposed. Firstly, different optimization methods were proposed for different types of convolution neural network structures. Then, after convoluting the input feature map, the input feature was combined with output feature. Finally, the combined feature was transferred to the next layer. Through the reuse of low-level features, the total number of extracted features would not change, so as to ensure that the accuracy of optimized network would not change. The experimental results on CIFAR10 dataset show that, the volume of; Visual Geometry Group (VGG) model is reduced to 75.4% and the prediction time is reduced to 43.5% after optimization, the volume of Resnet model is reduced to 53.1% and the prediction time is reduced to 60.9% after optimization, without reducing the accuracy on the test set.0 引言在2012年,AlexNet[1]以Top-5錯误率16.4%的显著优势夺得了大规模视觉识别挑战赛(Large Scale Visual Recognition Challenge, LSVRC)的冠军,比第二名错误率降低了12.2%的成绩,使得卷积神经网络(Convolution Neural Network, CNN)受到了广泛的关注与研究。
【神经⽹络与深度学习】ZLIB介绍zlib类库提供了很多种压缩和解压缩的⽅式,由于时间的关系我只学习⼀下内容,以下是我在实现web 服务器压缩数据⽹页中使⽤到⼀些函数和常⽤数据结构、常量等。
zlib使⽤过程压缩过程:deflateInit() ->deflate() ->deflateEnd(); 对应的解压过程 inflateInit() -> inflate() -> inflateEnd();压缩过程:deflateInit2() ->deflate() ->deflateEnd(); 对应的解压过程 inflateInit2() -> inflate() -> inflateEnd();zlib使⽤的实例请看:注释内容详细(英⽂)(来⾃百度百科,本⼈未加正式,请谅解)常⽤的数据结构typedef struct z_stream_s {z_const Bytef *next_in; //要压缩数据的⾸地址uInt avail_in; //压缩数据的长度uLong total_in; //压缩数据缓冲区的长度Bytef *next_out; //压缩数据保存位置。
uInt avail_out; //存放压缩数据位置的⾸地址uLong total_out; //存放压缩数据位置的⼤⼩z_const char *msg; //存放最近的错误信息,NULL表⽰没有错误struct internal_state FAR *state; /* not visible by applications */alloc_func zalloc; /* used to allocate the internal state */free_func zfree; /* used to free the internal state */voidpf opaque; /* private data object passed to zalloc and zfree */int data_type; // 表⽰数据类型,⽂本或者⼆进制uLong adler; /* adler32 value of the uncompressed data */uLong reserved; /* reserved for future use */} z_stream;对于z_stream我们⼀般使⽤z_stream stream;在deflateInit()或者inflateInit()前设置的参数,初始化参数设置stream.zalloc = Z_NULL;stream.zfree = Z_NULL;stream.opaque = Z_NULL;stream.avail_in = 0;stream.next_in = Z_NULL;在deflate()或inflate前设置的参数,压缩前的参数设置strm.avail_in = in_len;strm.next_in = in;strm.avail_out = out_len;strm.next_out = out;常⽤的常量⽤来设置压缩和解压缩时,结果数据输出的⽅式,具体区别没有看懂的(为了避免误导⼤家,⼤家尽量看/manual.html英⽂帮助吧)#define Z_NO_FLUSH 0 //没有缓存,直接写⼊到结果中#define Z_PARTIAL_FLUSH 1#define Z_SYNC_FLUSH 2#define Z_FULL_FLUSH 3#define Z_FINISH 4 //采⽤此种⽅式,压缩将会变成单步执⾏。
MobileNet v2是Google在2018年提出的一种轻量级神经网络模型,旨在在移动设备和边缘设备上实现高效的图像识别和处理。
MobileNet v2引入了一种新的注意力机制原理,有效地提高了模型的表达能力和图像识别的性能。
本文将对MobileNet v2的注意力机制原理进行详细的介绍和分析。
一、MobileNet v2的背景1.1 MobileNet v2的出现MobileNet v2是MobileNet系列的第二代模型,旨在解决第一代模型在精度和性能上的一些不足。
MobileNet v1在轻量级和高效的特点上表现出色,但在一些复杂场景下的识别精度仍有待提高。
Google团队提出了MobileNet v2,通过引入注意力机制来提高模型的表达能力和识别性能。
1.2 MobileNet v2的特点MobileNet v2在保持轻量级和高效的特点的通过注意力机制等创新技术,进一步提高了模型的表达能力和识别性能。
该模型被广泛应用于移动设备、无人驾驶、智能摄像头等场景,取得了良好的效果和应用价值。
二、MobileNet v2的注意力机制原理2.1 注意力机制的作用注意力机制是一种能够让模型在学习过程中自动关注重要信息的技术,可以有效提高模型对关键信息的抓取和利用,提高模型的表达能力和识别性能。
MobileNet v2在设计之初就引入了注意力机制,使模型可以更好地适应不同场景和任务的需求。
2.2 MobileNet v2的注意力机制原理MobileNet v2的注意力机制通过引入一种称为“SE模块”的结构来实现。
SE模块包括两个重要的部分,即“Squeeze”和“Excitation”。
其中,“Squeeze”阶段通过全局平均池化操作将特征图的空间维度降为1,将每个通道的特征进行压缩;而“Excitation”阶段则通过全连接层和激活函数来学习每个通道的权重,从而增强重要的特征信息。
2.3 注意力机制的优势MobileNet v2通过引入注意力机制,使模型可以更好地关注图像中的重要信息,提高模型对关键特征的感知能力;注意力机制能够降低冗余信息的影响,使模型更加高效和精确。
轻量化卷积神经⽹络模型总结bywilson(shffleNet,moblieNet,squ。
⼀、简介 主要参考博客:纵览轻量化卷积神经⽹络 1, SqueezeNet: SqueezeNet对⽐AlexNet能够减少50倍的⽹络参数,但是却拥有相近的性能。
SqueezeNet主要强调⽤1x1的卷积核进⾏feature map个数的压缩,从⽽达到⼤量减少⽹络参数的⽬的。
在构造⽹络的时候,采⽤VGG的堆叠思想。
2, moblieNet: MobileNet采⽤depth-wise convolution的卷积⽅式,能够减少参数数量和提升运算速度(运算速度主要靠创新性的计算⽅式达到)。
MobileNet将传统的卷积分为两步:Depth-wise convolution,逐通道的卷积,⼀个卷积负责⼀个通道,⼀个通道只被⼀个卷积核卷积;Pointwise convolution,将上⼀步得到的feature map串联起来,使得输出的每⼀个feature map包含输⼊层所有feature map的信息。
这种卷积⽅式,普遍能够⽐传统卷积⽅式减少8-9倍的计算量。
虽然都是参数是在同⼀个量级上,但是运算量却能少GoogleNet⼀个量级。
在构造⽹络的时候,采⽤VGG的堆叠思想。
3, shuffleNet: ShuffleNet第⼀部分的卷积⽅式和MobileNet⼀致,第⼆部分的卷积不同。
ShffleNet进⾏了channel shuffle,将各部分的feature map的channel进⾏有序的打乱,构成新的feature map,以解决group convolution带来的“信息流通不畅”的问题。
在构造⽹络的时候,采⽤ResNet的残差⽹络思想,并在旁路增加均值池化,与另⼀路的feature map进⾏串联⽽⾮相加,这样有效降低分辨率,却能够弥补分辨率减少⽽带来的信息损失。
4, Xception: Xception也可以看成是google inception的进化版,也是对depth-wise convolution的改进。
• 206•随着中医技术的不断发扬与传承,中草药作为我国的重要医药材料,中草药领域的发展应用一直受到专家学者的重视。
目前随着深度学习技术的快速发展,将该技术结合各种实际场景,用来解决现实生活中的问题成为当前的一种趋势。
因此,本系统利用深度学习技术,将人工智能技术与民族中草药进行结合,采用最新的图像识架构模式,即客户端/服务端模式。
其中客户端主要为用户的移动应用,服务端则为部署好的云服务器。
在移动应用端主要负责待查询草药的上传以及搜索结果的展示功能;服务器端则实现接受移动设备上传输的文字或图片,利用网络模型的识别结果在中草药数据库中进行识别,并且返回移动设备进行展示。
系统框架设计如图2所示。
MobileNet-v3网络在中草药查询鉴别系统设计与应用中南民族大学计算机科学学院 龙文汉 蓝佳宁 张东伟图1 功能组件结构图2 架构设计图2 识别算法实现2.1 Mobilenet-v3简述在深度学习中减少模型的参数量一直是学者的研究方向,其中最为著名的是MobileNet-v1、MobileNet-v2等轻量级网络。
本系统中使用的识别网络则采用结合两者优点的MobileNet-v3。
该网络主要具有两个创新点:(1)互补搜索技术组合:在网络结构利用platform-aware NAS 与NetAdapt 两种技术,第一个技术是在计算和参数量受限的前提下搜索网络的各个模块,即模块级搜索(Block-wise Search ),第二个技术是对各个模块确定之后网络层的微调。
(2)网络结构改进:基于MobileNet-v2网络断部在最后一步有一定的计算量,为了减少计算量将最后的平均池化层前移,同时删除最后一个卷积层。
MobileNet-v3由激励函数swish 进行数值近似的h-swish 激活函数,如公式(1)所示。
(1)基于以上两个创新点,MobileNet-v3在精度上优于前两个系列网络的同时,在检测速度上也具有优势。
深度向手机端神经网络进发:MobileNet压缩指南选自Machine Think作者:Matthijs Hollemans机器之心编译随着MobileNet 等面向移动设备的模型不断出现,机器学习正在走向实用化。
不过,由于深度学习等方法需要消耗大量计算资源的因素,目前我们距离真正的移动端人工智能应用还有一段距离。
在硬件之外,我们也需要对模型本身进行压缩,最近,荷兰工程师Matthijs Hollemans 向我们展示了他压缩MobileNet 的方法:通过删除卷积层的部分滤波器,他在保证准确性不变的情况下,让模型体量缩小了25%,让我们看看他是怎么做的。
随着机器学习技术向移动设备渗透的趋势,人们正在越来越注重于寻找让深度神经网络更快、更简洁的方式。
一种方法是提出更智能化的神经网络设计。
例如:MobileNet 可以在获得相同结果的情况下比VGG-16 小32 倍,速度快上10 倍。
另一个方法是采用现有的神经网络,并用删除与结果无关的神经元的方法来压缩它。
本文会着重介绍这种方法。
我们将着手改进MobileNet-224,让它的体量减小25%,换句话说,我们要把它的参数从400 万个减少到300 万个——同时不损失模型的准确性(好吧…只有一点点)。
如何做到更好鉴于MobileNet 比VGG16 要小32 倍,而准确性相同,前者捕获知识的效率显然更高。
的确,VGG 模型中的神经网络连接比我们所需要的多很多。
斯坦福大学韩松等人2015 年在论文《Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding》中提出的压缩网络方法展示了通过剪枝不必要的神经网络连接让VGG16 缩小49 倍,并保持准确性的方法。
现在问题来了:MobileNet 里还有不必要的连接接吗?即使这个模型已足够小,但我们能不能让它变得更小且不损失准确性呢?当你试图压缩一个神经网络,需要权衡的问题是模型尺寸与准确性。
通常,网络越小,速度就越快(当然也耗电更少),但预测出来的结果也会越差。
例如,MobileNet 的性能要好过SqueezeNet,同时前者也比后者大上3.4 倍。
在理想情况下,我们总是希望找到尽可能小的神经网络——不过它们必须为我们传递准确的结果。
这在机器学习中是一个开放问题,在正确的理论出现之前,让我们先试着从大模型开始剪枝吧。
在这个项目中,我使用了Keras 2.0.7 版中预训练的MobileNet,并运行在TensorFlow1.0.3 上。
如果使用ImageNet ILSVRC2012 验证集来测试,它的得分是:Top-1 accuracy over 50000 images = 68.4%Top-5 accuracy over 50000 images = 88.3%这意味着它有68.4% 的几率一次性给出正确结果,如果范围扩大到排名前五的结果,则准确率则为88.3%。
我们希望压缩这个模型,并让它保持以上分数。
注意:MobileNet 论文(MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications)声称它在ImageNet 上的准确率是70.6%,VGG16 是71.5%,GoogleNet 是69.8%。
我们还不知道这个数据是来自ImageNet 还是验证集。
无论如何,Keras 版的MobileNet 在验证集上的得分是68.4%,我们将会使用这个数字作为基准。
如何压缩一个卷积神经网络就像多数的现代神经网络一样,MobileNet 有着许多卷积层。
将每层的权重由小至大排列并剔除带有最小权重的连接就是一种压缩卷积层的方法。
这种方法是由Han 等人在将VGG 压缩49 倍时提出的。
听起来是个好方法但也存在着大缺陷:它造成了稀疏连接。
不幸的是,GPUs 并不擅长处理稀疏矩阵,并且在计算上花费了更多的时间,尽管网络得到了压缩,你并未由此而省时。
在这种情况下,压缩得更小并不意味着会更快。
但这对于追求魔鬼速度的我们并不奏效:小而快才是我们所追求的。
我们将移除复杂的卷积滤波器,而不是修剪掉单个连接。
这让我们保持连接紧密的同时也不会给GPU 带来麻烦。
回想一下一个卷积层产出一个带有一组特定数量的输出通道的图像。
每一个输出通道都包含了单一卷积滤波器带来的影响。
这样一个滤波器接管了所有来自于输入通道的加权和,并将这一加权和写入单一的输出通道。
我们要找出那种最不重要的卷积滤波器,并且将其输出通道从层中移除。
例如,MobileNet 中的层conv_pw_12 有1024 个输出通道。
我们会舍弃这其中的256 个通道使得被压缩版的conv_pw_12 只有768 个输出通道。
注意:为了迎合Metal,我们应该以每次移除四个输出通道的速度进行。
因为Metal 实际上是一个图形API,它用纹理(texture)来描述神经网络的图像数据,而每一个纹理为四个连续的通道保存数据。
所以,如果我们只移除一个输出通道,Metal 仍然需要处理其他三个通道的纹理。
考虑到Metal 的这一特点,我们只有以四的倍数来移除通道才会使得压缩层有意义。
现在问题是:我们可以移除哪些滤波器和输出通道?我们仅希望在不影响太多性能的情况下移除一些输出通道。
我们可以使用不同的度量方案来估计滤波器的相关性,但是我们也可以选择非常简单的方法:滤波器权重的L1 范数,即所有滤波器权重的绝对值之和。
例如以下是MobileNet 前面几个卷积层(32 个滤波器)的L1 范数:如图所示,L1 范数非常小、接近于零的第一个层有10 个滤波器。
我们或许可以去除这些滤波器。
但是由于我们的目标是使用带有Metal 的网络,因此去除10 个滤波器没有意义。
我们必须去除8 个或12 个滤波器。
我首先尝试去除8 个最小的滤波器。
效果很好,准确率完全没有损失,因此我决定去除12 个。
稍后你可以看到,它的效果依然很好。
这意味着我们实际上能够去除该网络第一个卷积层中37.5% 的滤波器,而网络性能不会变差!这里有MobileNet 所有卷积层的L1 范数示图。
你可以看到很多层的滤波器对网络几乎没有贡献(低L1 范数)。
注:由于并非所有层都具备相同数量的输出通道,上图中所有数据都按同样的标准进行归一化处理。
横轴代表通道(按L1 范数的值从低到高),纵轴代表实际的L1 范数(同样是归一化处理后的)。
你可以在Li et al 所写的论文《Pruning Filters For Efficient Convnets》中获取该方法的更多详情。
从一个层中去除滤波器意味着该层输出通道的数量变少。
自然而然,这对该网络下一层也有影响,因为下一层现在的输入通道变少了。
因此,我们还必须从那一层去除对应输入通道。
当卷积之后是批量归一化(BN)时,我们还必须从批量归一化参数中去除这些通道。
MobileNet 事实上有三种卷积层:一个常规的3×3 卷积(第一层)Depth-wise 卷积1×1 卷积(又名pointwise convolution)我们仅从3×3 和1×1 卷积中去除滤波器,而非Depth-wise 卷积。
一个Depth-wise 卷积必须具备相同数量的输出通道和输入通道。
压缩可能没有什么收获,而且Depth-wise 卷积很快(因为它们的工作比常规卷积要少)。
因此我们主要将注意力集中在带有3×3 和1×1 卷积的层。
再训练因为从层中删除滤波器会让网络的准确性变差——毕竟,你在丢弃神经网络学习到的东西,即使它可能不是非常重要——你需要做一点重新训练,这样才能弥补丢弃造成的损失。
在训练意味着你需要再次调用model.fit()。
一点小小的试错后,我们就会把学习率定在0.00001——一个非常小的数字,任何稍大的训练参数都会让结果超出控制。
学习率如此之小的原因是,在这里,大部分网络已经被训练过了,我们只想进行小改进来提升结果。
过程是这样:1. 在层中4 倍并行地移除滤波器(即输出通道)2. 再训练该神经网络几个epoch3. 对验证集进行评估,以检查该神经网络的准确性是否恢复至之前水准4. 移动到下一层并重复这些步骤正如你所看到的,这个过程费时费力,因为我们每次只能改动一层,而修改之后每次又要重新训练神经网络。
每个层中,可以丢弃的滤波器都是不太一样的。
使用训练子集MobileNet 已在ILSVRC 比赛数据集(也就是ImageNet)中进行过预训练了。
这是一个巨大的数据集,其中包含超过120 万张训练图片。
依靠最近装配的深度学习机器(只有一块英伟达GTX 1080Ti 的Linux 系统),每个epoch 需要训练两小时之久。
即使用5 万张图像验证集来做这件事也需要3 分钟。
毫无疑问,这样的硬件让快速迭代变得难以实现。
我可不想每天盯着屏幕两个小时,只为看到模型出现一点点小变化。
所以我们得在样本上找办法,而不是用完整的数据集,我在数据集1000 个类别中每类随机找出五张图片(这多少有点代表性),形成了5000 张图片的训练子集。
现在每个epoch 只需要30 秒钟了。
这要比两个小时方便多了!为了进行验证,我从完整验证集中随机抽取了1000 张图片作为验证集,用它来评估网络性能只需要画上3 秒钟。
看来,使用样本的方法很有效。
压缩第一个卷积层如你所见,第一个卷积层有10 个非常小的L1 规范滤波器。
因为对于Metal,我们需要以4 的倍数来去除滤波器,所以我删除了具有最小L1 规范的12 个滤波器。
最初,我还没有从神经网络中删除任何滤波器,只是将他们的连接权重设置为0。
理论上,这样的事情可以让Top-1 准确率从69.4% 降到68.7%——有一点损失,不过没有什么不是在训练不能解决的。
接下来,我创建了一个与原始层相同的新模型,并在这里删除了滤波器,所以在第一个卷积层中,实际上只有24 个输出通道(而不是原来的36 个)。
但是现在准确率评分变得很低了:29.9%,发生了什么?理论上,将连接权重设置为0 和删除连接应该可以获得相同的结果,但实践中却出了差错:我忘了将下一层相应输入通道的权重设置为0。
而更糟的是,因为下一层是深度卷积,我还得设置相应的参数,让该层的批量归一化为0。
教训:从一层中去除滤波器也会对其它层产生影响。
而这些变化会影响评分。
所以删除第一层中的滤波器损失37.5% 的准确率不太值得?在检查整个模型后,我发现问题在于第二个批量范数(batch norm)层上12 个偏置值:当它们变成其他任何数字后,其他的东西都归零了。