欢迎关注本人的微信公众号AI_Engine
好久不见!由于小G同学的工作原因,确实有一段时间没有更新博文了。经过谨慎的思考后,目前小G同学已经提出离职并准备入职新公司了,谢谢这段时间大家的支持,我的每一点点进步都与大家的鼓励息息相关,小G感激不尽~
这篇博文我们的主题是MobileNet v1,我们开门见山的说:它的优点就是拥有较少的浮点计算量,那么在牺牲极少精度的同时去换取更好的数据吞吐量,也不失为一种提高性能的最佳方案。想当年(2012年)AlexNet大放异彩,相比以前浅学习方法在ImageNet中top5 error前所未有的下降约10%,CNN一鸣惊人。后续VGG,GoogleNet,ResNet进一步提高CNN的精度。但是到ResNet,网络已经达到152层,模型大小动辄几百300MB+。这种巨大的存储和计算开销,已经严重限制了CNN在某些低功耗领域的应用(注意:这里说的是低功耗领域噢~),所以必须有一种能在算法层面有效的压缩存储和计算量的方法,而mobileNet就此为我们的忧愁打开了一扇窗。我们先复习下CNN,普通卷积如图所示:
传统的卷积网络是跨通道的跨通道的跨通道的(重要的事情说三遍)。对于一个通道数为M 的输入Feature Map,我们要得到通道数为N 的输出Feature Map。普通卷积会使用 N
个不同的DK*DK*M以滑窗的形式遍历输入Feature Map,因此对于一个尺寸为 DK*DK的卷积参数个数为参数个数为参数个数为(重要的事情说三遍)DK*DK*M*N(留给读者一个思考问题:参数个数是DK*DK*M*N,那计算量大约是多少?欢迎留言回答)一个普通的卷积可以表示为:
那么mobileNet究竟与普通CNN有什么本质的区别与联系呢?答案就是在mobileNet中使用的Depthwise Separable Convolution技术,成为模型压缩的一个最为经典的策略。Depthwise卷积是指不跨通道的不跨通道的不跨通道的卷积,也就是说Feature Map的每个通道有一个独立的卷积核,并且这个卷积核作用且仅作用在这个通道之上。这其实本质上是一个分组卷积(Group convolution)的过程,比如输入的feature map尺寸为H*W*C,同时有k个h*w卷积核。对于一般卷积,输出feature map的尺寸为H' * W' * K,而Group convolution的实质就是将convolution分为g个独立的组,分别计算:
·把input feature分为g个组,每组尺寸为H*W*(C/g)
·把kernel也分为g个组,每组尺寸为h*w*(k/g)
·按顺序,每组input feature和kernel分别做普通卷积,输出g组H' * W' * (k/g)特征,即一共H' * W' * K (注意虽然输出channels的数量相同,但是由于分组的原因,所有的通道并没有打通,只是在每个组内进行跨通道求和~)
上述是使用深度分离卷积3D图我们看看Depthwise卷积的二维图(盗的):
由于不跨通道的原因,卷积的参数量由DK*DK*M*N减少至DK*DK*M(思考题:浮点计算量减少了多少呢?) ,Depthwise Convolution的数学表达式为:
或许亲们看到这里可能已经想到了,单独使用Depthwise似乎并没有卵用,channel并没有发生什么本质的变化,而且通道都不进行跨越,组合特征也无法提取。没错,大神们已经想到了1*1卷积核升降维了!先给大家一个伪公式:Depthwise Separable = Depthwise + Pointwise。MobileNet v1中引入了Pointwise卷积用于特征合并以及升维或者降维,Pointwise的参数数量为 M * N ,计算量为计算量为计算量为:
Mobilenet v1核心是把卷积拆分为Depthwise+Pointwise两部分,下面是二者的示意图:
当然,除了针对卷积核优化外,Mobilenet v1还给出了基本网络结构:
Mobilenet v1已经非常小了,但是还可以对图中的所有卷积层数量统一乘以缩小因子α以压缩网络,这样Depthwise+Pointwise总计算量可以进一降低。当然,压缩网络计算量肯定是有代价的,那就是精度啦,所以在实战中大家要权衡好哈!总结一下:这篇博文主要概括了MobileNet v1的思想与原理,下一篇会介绍MobileNet v2的相关知识。小G同学会继续坚持总结,争取写出精彩的博文,让大家真的满意。最近思考了很多,似乎看懂了一些道理。正所谓,路还长,常思量!最后小G同学在这里衷心祝愿大家工作顺利,家庭幸福~