mobileNetV1网络解析,以及实现(pytorch

运算量:

2 × 3 × 1 1 2 × 55 × 55 × 6 2 \times 3 \times11^{2}\times 55\times 55 \times 6 2×3×112×55×55×6=13176900

分组卷积

===============================================================

分组卷积则是对输入feature map进行分组,然后每组分别卷积。

假设输入feature map的尺寸仍为 C 0 × H × W C_{0}\times H \times W C0​×H×W,输出feature map的数量为 C 1 C_{1} C1​个,如果设定要分成G个groups,则每组的输入feature map数量为 C 0 G \frac{C_{0}}{G} GC0​​,每组的输出feature map数量为 C 1 G \frac{C{1}}{G} GC1​,每个卷积核的尺寸为 C 0 G × K × K \frac{C_{0}}{G}\times K \times K GC0​​×K×K,卷积核的总数仍为 C 1 C_{1} C1​个,每组的卷积核数量为 C 1 G \frac{C{1}}{G} GC1​,卷积核只与其同组的输入map进行卷积,卷积核的总参数量为 N × C 0 G × K × K N\times \frac{C_{0}}{G}\times K \times K N×GC0​​×K×K,总参数量减少为原来的 1 G \frac{1}{G} G1​。

计算量公式:

[ ( 2 × K 2 × C 0 / g + 1 ) × H × W × C o / g ] × g \left[\left(2 \times K^{2} \times C_{0} / g +1\right) \times H \times W \times C_{o} / g\right] \times g [(2×K2×C0​/g+1)×H×W×Co​/g]×g

分组卷积的参数量为:

K ∗ K ∗ C 0 g ∗ C 1 g ∗ g K * K * \frac{C_{0}}{g} * \frac{C_{1}}{g} * g K∗K∗gC0​​∗gC1​​∗g

举例:

输入的尺寸是227×227×3,卷积核大小是11×11,输出是6,输出维度是55×55,group为3

我们带入公式可以计算出

参数量:

1 1 2 × 3 3 × 6 3 × 3 11^2 \times \frac{3}{3} \times \frac{6}{3} \times 3 112×33​×36​×3=726

运算量:

[ ( 2 × 1 1 2 × 3 / 3 + 1 ) × 55 × 55 × 6 / 3 ] × 3 \left[\left(2 \times 11^{2} \times3 / 3 +1\right) \times 55 \times 55 \times 6 / 3\right] \times 3 [(2×112×3/3+1)×55×55×6/3]×3=2205225

深度可分离卷积(Depthwise separable conv)

============================================================================================

设输入特征维度为 D F × D F × M D_{F}\times D_{F}\times M DF​×DF​×M,M为通道数, D k D_{k} Dk​为卷积核大小,M为输入的通道数, N为输出的通道数,G为分组数。

当分组数量等于输入map数量,输出map数量也等于输入map数量,即M=N=G,N个卷积核每个尺寸为$D_{k}\times D_{k}\times 1 $时,Group Convolution就成了Depthwise Convolution。

逐点卷积就是把G组卷积用conv1x1拼接起来。如下图:

查看源图像

深度可分离卷积有深度卷积+逐点卷积。计算如下:

  • 深度卷积:设输入特征维度为 D F × D F × M D_{F}\times D_{F}\times M DF​×DF​×M,M为通道数。卷积核的参数为 D k × D k × 1 × M D_{k}\times D_{k}\times 1 \times M Dk​×Dk​×1×M。输出深度卷积后的特征维度为: D F × D F × M D_{F}\times D_{F}\times M DF​×DF​×M。卷积时每个通道只对应一个卷积核(扫描深度为1),所以 FLOPs为: M × D F × D F × D K × D K M\times D_{F}\times D_{F}\times D_{K}\times D_{K} M×DF​×DF​×DK​×DK​

  • 逐点卷积:输入为深度卷积后的特征,维度为 D F × D F × M D_{F}\times D_{F}\times M DF​×DF​×M。卷积核参数为 1 × 1 × M × N 1\times1\times M\times N 1×1×M×N。输出维度为 D F × D F × N D_{F}\times D_{F}\times N DF​×DF​×N。卷积过程中对每个特征做 1 × 1 1 \times 1 1×1的标准卷积, FLOPs为: N × D F × D F × M N \times D_{F} \times D_{F}\times M N×DF​×DF​×M

将上面两个参数量相加就是 D k × D k × M + M × N D_{k} \times D_{k} \times M+M \times N Dk​×Dk​×M+M×N

所以深度可分离卷积参数量是标准卷积的 D K × D K × M + M × N D K × D K × M × N = 1 N + 1 D K 2 \frac{D_{K} \times D_{K} \times M+M \times N}{D_{K} \times D_{K} \times M \times N}=\frac{1}{N}+\frac{1}{D_{K}^{2}} DK​×DK​×M×NDK​×DK​×M+M×N​=N1​+DK2​1​

mobileNetV1

======================================================================

详见论文翻译:

https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/122692846

mobileNetV1的网络结构如下图.前面的卷积层中除了第一层为标准卷积层外,其他都是深度可分离卷积(Conv dw + Conv/s1),卷积后接了一个7*7的平均池化层,之后通过全连接层,最后利用Softmax激活函数将全连接层输出归一化到0-1的一个概率值,根据概率值的高低可以得到图像的分类情况。

image-20220125175313205

pytorch版本


import torch

import torch.nn as nn

import torchvision

def BottleneckV1(in_channels, out_channels, stride):

return nn.Sequential(

nn.Conv2d(in_channels=in_channels,out_channels=in_channels,kernel_size=3,stride=stride,padding=1,groups=in_channels),

nn.BatchNorm2d(in_channels),

nn.ReLU6(inplace=True),

nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=1),

nn.BatchNorm2d(out_channels),

nn.ReLU6(inplace=True)

)

class MobileNetV1(nn.Module):

def init(self, num_classes=1000):

super(MobileNetV1, self).init()

self.first_conv = nn.Sequential(

nn.Conv2d(in_channels=3,out_channels=32,kernel_size=3,stride=2,padding=1),

nn.BatchNorm2d(32),

nn.ReLU6(inplace=True),

)

self.bottleneck = nn.Sequential(

BottleneckV1(32, 64, stride=1),

BottleneckV1(64, 128, stride=2),

BottleneckV1(128, 128, stride=1),

BottleneckV1(128, 256, stride=2),

BottleneckV1(256, 256, stride=1),

BottleneckV1(256, 512, stride=2),

BottleneckV1(512, 512, stride=1),

BottleneckV1(512, 512, stride=1),

BottleneckV1(512, 512, stride=1),

BottleneckV1(512, 512, stride=1),

BottleneckV1(512, 512, stride=1),

BottleneckV1(512, 1024, stride=2),

BottleneckV1(1024, 1024, stride=1),

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值