模型选择与设计,一站式caffe工程实践连载(6)
这一次我的分享内容是模型的选择与设计,这是本次系列课程的比较核心的内容,具体将包含以下几个方面:首先,一个基础模型的介绍,我们所选择的基础模型是mobilenet的。虽然深度学习已经发展了许多年,但是实际上基础的网络模型变种其实并没有那么多。从早期的Alexnet GoogLeNet到后来的mobilenet,都是一系列经典模型的代表。很多的模型都是在这些基础模型的基础之上进行一些简单的修补和变化。第二个,就是我们反卷积与skip连接的设计,前面我们已经详细介绍了反卷积的原理以及skip连接的一些作用。这一次我们在设计网络的过程中,我们就会讲讲它的具体的设计细节。第三部分是模型的压缩,我们会给大家介绍一个比较简单的模型压缩技巧,就是互补卷积。因为我们最终的目标是训练一个可以在移动端,也就是手机端可以实时运行的一个图像分割网络,我们不可能设计一个有十几兆甚至几十兆,然后运行时间,一次图像的操作需要一秒甚至两秒这样的一个神经功能,所以我们需要设计一个高效的神经网络。在设计一个高效的神经网络的过程中,我们肯定需要用到一些简单的模型的压缩技巧。
Mobilenet网络结构
mobilenet是google提出的一个非常具有代表性的移动端的框架,移动端的一个网络,它的核心内容是depthwise卷积跟pointwise卷积,也就是它将我们一个通常意义上的一个卷积分解成了两个卷积的串联。
下面分别介绍,如图片所示:
这张图展示的是depthwise卷积。那么究竟什么是depthwise卷积呢?
第一张图就是一个标准的卷积。一个标准的卷积,它的输入的feature map数量是M,卷积和是dk,它的输出feature map数量是N,那么一个标准的卷积输出的feature map的每一个通道,都与输入的每一个通道都有关系。
depthwise卷积
然后我们看看那depthwise卷积有什么不一样?depthwise卷积进行的分组,也就是说将我们输入的M个通道的一个feature map这样的block,分成了很多很多的组,最集中的情况下就是分成M组,每一个通道都是单独的一组,我们的输出跟我们的输入通道数目是相等的。假如我们把输入分成M组,那么输出每一个通道就只与输出的某一个通道进行相连。这就是depthwise卷积,也就是分组卷积。上图图 C就是展示了1×1的卷积。1×1的卷积实际上就是一个卷积和为1×1的普通的卷积。
depthwise卷积特征
depthwise卷积,它有一个特点,就是输入输出的通道一定是相等的。在最极端的情况下,也是mobilenet的原始的设计情况下,每一个通道都只与他这个通道进行卷积,不与其他的通道融合信息。
Pointwise卷积
Pointwise卷积,它是一个卷积核核大小为1×1的正常卷积。depthwise它实现的空间的分离,Pointwise卷积实现了空间的融合。这样的两个卷积的串联的block的设计替换了正常的卷积,这就是mobilenet的核心思想。
mobilenet设计优势
那这样的设计到底有什么优势呢?我们来给大家算一算。它最大的优势就是计算量下降。对,一个标准的卷积,如果它的输入为M乘以DK乘以DK的这样一个feature map,它的输出为N乘以D阶乘,由此推出,这样的一个标准卷积,它的计算量就是M乘以dx乘DK乘以N*DJ乘DJ这样的一个计算量,那如果是mobilenet,它的计算量是什么样的呢?depthwise是由于是分组的卷积,M的每一个通道都是相互独立的。所以depthwise计算量是M乘以DK乘以DX乘 DJ乘DJ,而Pointwise它是一个1×1的卷积,所以它的计算量是M乘N乘以DJ乘以DJ。我们看看计算量的对比,从上面可以看出,mobilenet除以标准卷积的一个计算量是一除以N加上一除以DK乘以DK,由于网络中大量使用的是3 x 3的卷积和,如果N比较大的话,那上面的一个计算量对比就约等于E除以D和A乘以DK,也就是1/9。 这样mobilenet,它这一个卷积对应它原始的标准卷积,它的计算量就基本上降低了一个数量级,这就是mobilenet的最大优势。因为移动端对计算量,尤其是计算时间是非常敏感的(蜂口小程序)
模型设计
下面说第二部分,我们说说反卷积怎么设计,我们直接看网络结构,如下图所示:
其中deconv6包含了五个反卷积,我们采用的这样的一个设计思想,也就是逐级恢复原始分辨率,我们不是一次性将图像上采样到原来的16倍,而是通过五个反卷积block每次上采样两倍。这样设计有什么好处呢?从deconv1到deconv5,每一次反卷积恢复两倍的分辨率相比,直接恢复一个更大倍率的尺寸,这还可以增加网络的深度和非线性的能力。这就是我们反卷积的一个设计思想。
Skip连接
我们再来看看skip连接,如下图所示:
我们可以看到我们以deconv3为例子,它与conv1 block进行的连接,也就是与在底层的一个比较底层的与它feature map大小相等的block进行了串联。串联之后成为block_6-3这样的一个新的输入。skip连接,就是每一个反卷积的分辨率都与它大小相同的一个卷积层进行连接,这样,他们就可以互补高层信息和底层信息,增加恢复的细节。
csrelu通道补偿
最后我们看看一个模型压缩的技巧 —— csrelu通道补偿技术。
我们直接看网络结构,如下图所示:
我们可以看到,conv5_5,这样的一个卷积之后,我们接了power5-5,它的操作实际上就是对conv5-5乘以-1,然后两者相连,得到一个新的输入,然后再进行一个新的卷积操作。为什么可以这样做呢?是因为经过大量的实验证明,我们发现了这样一个现象,即网络的参数有互补的现象。如果我们就一个减半后的一个通道补上这个通道的反,然后串联起来会基本上相当于原有的模型。而我们不像它的反的这样一个操作,基本上就不耗时了。这样的话,我们的feature map的数量就降低了一倍,计算量也就降低了一倍。
mobilenet的核心block就是我们前面说的depthwise+pointwise这样的一个串联结构。其中,depthwise因为是分组的卷积,它大大的降低了一个通道的数目的计算量。所以pointwise才是其中计算量比较大的一个部分。也就是图中的SEP这样的一个卷积操作。于是我们对SEP这样的一个卷积操作使用的crelu这样的一个通道补偿技术,可以直接降低一倍的计算量。所以对于移动端的模型来说是非常高效的,也是非常简单的。当然,图像压缩和模型的压缩远远不止这些技术,还有Shufflenet,Densenet等等一系列的图像压缩技巧, 在此我们就不再赘述。
以上就是我们模型设计最核心的一些技术细节
完整内容及视频解读,请关注蜂口小程序~
参与内测免费获取蜂口所有内容,请申请内测(1*8*8*1*1*2*1*7*5*9*5),更有其他优惠福利多多,欢迎大家多多参与,尽情挑刺,凡是好的建议,我们都会虚心采纳哒~
蜂口小程序将持续为你带来最新技术的落地方法,欢迎随时关注了解~