网络加速之mobilenetV1

简介
是发布的手机端的网络的结构,其目的是从结构上减少网络参数,加速网络运行,整个网络深度是28层 。这方面的文章还有,。
论文地址:
代码:
创新点(深度分分离卷积)引入参数进行通道和 map调整 深度可分离卷积
实现加速的核心部分就是使用深度可分离卷积进行加速 。传统的卷积方式是卷积核对所有输入的 map卷积求和 。计算复杂度为:
而深度可分离卷积将标准卷积分解成一个深度卷积和一个点卷积(1 × 1卷积核) 。
深度卷积
深度卷积如下,即计算过程是每一个卷积核只计算对应的 map:

网络加速之mobilenetV1

文章插图
因此计算复杂度为:
点卷积
点卷积也就是1x1卷积,其目的使为了将通道信息进行融合 。时间复杂度为:
最终深度可分离卷积与标准卷积计算量之比为:
网络加速之mobilenetV1

文章插图
Width :
为了使模型变得更加瘦,引入宽度因子α (Width),用于控制输入和输出的通道数,即输入通道从M变为 αM,输出通道变为αM 。计算量为:
:
引入分辨率因子来控制分辨率大小 。分辨率因子为ρ,通过设置输入是 224, 192, 160 or 128.来减少参数 。
模型大小影响
与其他模型对比
网络结构
网络加速之mobilenetV1

文章插图
实现 传统的 的实现是使用for循环计算每一次卷积, 因此速度较慢 。代码如下:
template void BaseConvolutionLayer::forward_gpu_gemm(const Dtype* input,const Dtype* weights, Dtype* output, bool skip_im2col) {const Dtype* col_buff = input;if (!is_1x1_) {if (!skip_im2col) {conv_im2col_gpu(input, col_buffer_.mutable_gpu_data());}col_buff = col_buffer_.gpu_data();}for (int g = 0; g < group_; ++g) {caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, conv_out_channels_ /group_, conv_out_spatial_dim_, kernel_dim_,(Dtype)1., weights + weight_offset_ * g, col_buff + col_offset_ * g,(Dtype)0., output + output_offset_ * g);}}
【网络加速之mobilenetV1】知乎上的分析如下: