mobilenet v1和 mobilenet之间的区别,V2是在V1上做了什么改进?

mobilenet v1 主要是提出一种深度可分离卷积,将原来的三维度卷积  分成二维度加上  厚度上的单独卷积,从而可以实现参数上的极大减少。【主要带来计算量和参数量的大量减少。 计算量减少9倍左右的参数量。

 

该网络架构核心的特点是分成提出了两种卷积形式Depthwise convolution和pointwise convolution。

  【1】Depthwise convolution对每个输入通道使用不同的卷积核,每个通道对应一个卷积核,其应用于depth级别。

  【2】pointwise convolution从含义上就是普通的卷积,只不过其维度是1*1形状大小的。

                                                     

                                                                                

      在进行使用时,首先是使用depthwise convolution对不同的通道进行分别的卷积【这样挺好的,就是每个通道使用一个二维矩阵】,然后再使用pointwise将depthwise卷积的结果合在一起。【主要的参数吧,可以很多个1*1*厚度   *  个数的卷积,实现个数级的升降维度】

                                                                                 

       换个角度解释,比如原来需要  8个3*3*3的卷积核【比如原来特征图厚度为3,现在需要生成厚度为8的特征图】,那么   如果用深度可分离卷积的话,就可以,首先是Depthwise convolution需要参数量为3*3*3个【对应于三个厚度通道,每个通道都需要一个3*3的矩阵】,而再加上pointwise convolution就是 1*1*3*8大小的【使用起到升降维度的1*1矩阵对 维度进行调整,同时使用了8个矩阵,这个是可以自己调节的】,发现没,减少了非常多。

  接下来我们分析从计算量和参数量角度  ,Mobilenet中的深度可分离卷积相对于普通卷积所能带来的减少量吧。

   【1】在参数量方面,假定Dk是卷积核的长和宽、  M是厚度、N是卷积核的数量,    可以发现左为原卷积的参数量,   右为进行深度可分离卷积拆解后的参数量,

                                                   

 带来的参数减少量为:Dk*Dk*M*(N-1)   -   M*N

 【2】在计算量方面,标准卷积是左侧的公式,其中可以明确吧,是对所有的参数都乘上原特征图的  宽度和长度,每个参数都做完全的计算。

                                        

     而深度可分离卷积比舒服的多,相当于第一部分 少乘 卷积核数量N这一维度, 之后补上纯粹的1*1*M*N卷积核上的参数乘过去。

                                 

   经过这样的处理计算后,参数量和计算量均降为原来的  九分之一   到八分之一。【论文中有说明,参数和计算量下降到原来的九分之一左右,这个也跟具体的使用有关,而准确率只下降极小的1%】

                                                                                                   

   如上是最为核心的深度可分离卷积的部分, 其具体实现时对应的是如下的形式上的替换。可以看到在这里是  将之前  3*3卷积的直接形式,分为  深度卷积  -> BN -> Relu6->1*1逐点卷积 ->BN ->Relu这  6个部分,   使用 深度卷积+逐点卷积  来提换原来的  3*3普通卷积,  此外可以发现这里是将 Relu 激活函数换成了Relu6.

                                                      

    激活函数替换后的对比如下,Relu6的公式如右【其特点就是将 输入值大于6的部分,直接设置值为6, 作者认为,使用relu6可以在低精度计算中具有较好的  鲁棒性】。

                                                       

  从整体来看,其架构对应是如下的形式:

                                                                               

 

————————————————————————————————————————————————————                    

 V2是在V1上做了什么改进? 

答:V2是在V1基础上主要加入了对残差连接的利用。

 其相对于V1版本有三个比较大的创新点。

   【1】利用Inverted residuals策略,在V1版本中没有很好地利用 Residual Connection,而这种残差在大多情况下都是比较好的,所以在 V2中把该模块加了过去。

                                                                 

    【2】使用Linear bottleneck策略把最后一个的 激活层换成线性形式,   也就是把Relu6层变成了  Linear形式。    

           原因是我们发现深度卷积部分的卷积核在  训练时特别容易训废掉【也就是发现深度卷积得到的卷积核很多是空的,我觉得这个空,意思应该是核上值为0】, 作者认为是Relu激活函数导致的问题。

                                                                       

         作者也是有做分析的,分析把relu结果变换embedding到高维空间上进行观察,发现在低维度relu是很容易造成信息的丢失,  而在高维度上做relu时,信息丢失则比较少。 因此这种丢失就解释了 为什么深度卷积的卷积核很多为空,所以因此  Relu会造成信息耗损,  就将relu替换成线性激活函数来使用。 进行替换时并不是每一层都替换,而只是对最后一层进行的替换。

                    

     【3】使用了Expansion layer策略,这个方式使用的  原因  是为了   让  深度卷积操作可以在更高的通道的上进行【因为原始 深度卷积是有多大卷多大】,这样的话可以在更高维度上进行处理,能有更好的效果,  所以   我们在 深度卷积前 先加上  逐点卷积,按照  PW逐点扩张卷积 ->  DW深度卷积操作 ->PW 压缩卷积。     使用这样的方式  三步替代之前的两步操作

                    

    【总结】总体下来,就是以上三点,使得  其结构可以表达成如下的形式【先升维、再卷积、再降维】, 也可以对应右侧的对比观察。

                                       

 

 

参考:

https://blog.csdn.net/c20081052/article/details/80703896

https://blog.csdn.net/kangdi7547/article/details/81431572

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章