文章目录

  • 前言
  • 1.mobilenetV1解析
      • 网络结构
      • 普通卷积修改为深度可分离卷积
      • 为什么深度可分离卷积会比普通的卷积推理时间要快。
    • 3.mobilenetV2解析
      • 网络结构
      • 为什么选择使用有限制的relu6作为激活函数。
      • 为什么最后输出不用relu激活函数
  • 代码解析
    • mobilenetv2的forward函数

前言

MobileNet网络是由google团队在2017年提出的,专注于移动端或者嵌入 式设备中的轻量级CNN网络。相比传统卷积神经网络,在准确率小幅降低的前提下大大减少模型参数与运算量。(相比VGG16准确率减少了0.9%, 但模型参数只有VGG的1/32)。主要创新点在于深度可分离卷积,而整个网络实际上也是深度可分离模块的堆叠。
mobilenetv1论文地址:https://arxiv.org/abs/1704.04861
mobilenetv2论文地址:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8578572

1.mobilenetV1解析

网络结构

DW(Depthwise Convolution)卷积:对输入特征层,每个通道对应一个卷积核且每个卷积核的通道数仅为1个通道。这样对每一通道进行逐通道卷积的操作,就得到了和输入特征图通道数一致的输出特征图。
PW(Pointwise Conv)卷积:对输入特征层,进行每个像素点卷积(1X1)卷积。卷积核大小为1X1,通道数为输出所需的通道数。

普通卷积修改为深度可分离卷积

为什么深度可分离卷积会比普通的卷积推理时间要快。

我们看看普通卷积的计算量:
对于输入为SxSxM大小的特征层,使用KxK大小的卷积核,要使输出变为PxPxN。计算量为:

计算量大小:KxKxMxNxPxP

再看看使用深度分离卷积的计算量:

使用DW:KxKx1xMxPxP # 仅使用一个卷积核通道,并且进行DW卷积输出通道数不变
使用PW:1x1XMxNxPxP    # 仅使用卷积核大小为1X1的卷积,并且进行PW卷积输出通道数会变
DW+PW:k*k*M*P*P+M*N*P*P

比较两者的关系

(k*k*M*P*P+M*N*P*P)/K*K*M*N*P*P=1/N+1/k^2
所以如果卷积核大小为3x3,那么理论上普通卷积计算量是DW+PW的8到9倍。
这就是为什么深度可分离卷积会比普通的卷积运行时间要快

mobilenetv1还设置了两个超参数α和β来控制网络结构的宽度和输入分辨率大小

通道数和分辨率的不同选择对应的结果。

3.mobilenetV2解析

网络结构


t是通道扩展因子(升维和降维几倍) ,c是输出特征矩阵通道数channel ,n是bottleneck的重复次数 ,s是步距(针对第一个残差层,其他为1)

主要提出了倒残差结构

Resnet里的残差结构是先1x1卷积降维后,3X3卷积,再1X1卷积升维,两边大,中间小。这里是先升维,DW卷积后,1X1卷积降维。直接1X1卷积降维再经过深度可分离卷积(卷积核通道仅为1)后,提取的特征会更少,所以采用先升维丰富特征信息的思想。这里每层的激活函数由原来的BN+Relu变成了Relu6,最后由高维变低维输出没有用relu6了的是线性层。如下图所示,并且只有输入和输出分辨率和通道一致的时候才采用残差连接。

为什么选择使用有限制的relu6作为激活函数。

因为mobilenet主要是用在移动端设备,如果限制权值范围,使得整个区间被好好的利用起来,这样的话权值能够被更加均匀的映射到0-255区间上,使得权值信息更多地被保留,从而减少了量化误差。
https://blog.csdn.net/tangshopping/article/details/112979152

为什么最后输出不用relu激活函数


因为作者发现,relu激活函数在变为低纬度的输出会损失很多信息,变为高维用可以。因为最后输出是由高维变为低维,就直接用1X1线性层了(这里我们在压缩通道操作的时候要不要考虑下呢)。

代码解析

mobilenetv2的forward函数

 def forward(self, x):"""Forward function."""x = self.conv1(x)outs = []for i, layer_name in enumerate(self.layers):layer = getattr(self, layer_name)x = layer(x)if i in self.out_indices:outs.append(x)return tuple(outs)

conv1:是一个卷积核k=3,stride = 2,padding=1的3X3卷积。
layer层

for i, layer_cfg in enumerate(self.arch_settings):expand_ratio, channel, num_blocks, stride = layer_cfg # 每个layer层的配置out_channels = make_divisible(channel * widen_factor, 8)  # 输出通道调整为8的整数倍inverted_res_layer = self.make_layer(    # 创建倒残差块out_channels=out_channels,num_blocks=num_blocks,stride=stride,expand_ratio=expand_ratio)layer_name = f'layer{i + 1}'self.add_module(layer_name, inverted_res_layer)self.layers.append(layer_name)if widen_factor > 1.0:self.out_channel = int(1280 * widen_factor)
else:self.out_channel = 1280

make_divisible

def make_divisible(value, divisor, min_value=None, min_ratio=0.9):if min_value is None:min_value = divisornew_value = max(min_value, int(value + divisor / 2) // divisor * divisor) # 注意// divisor * divisor不会抵消,是向下取整后再乘# Make sure that round down does not go down by more than (1-min_ratio).if new_value < min_ratio * value:    # 确保不会减少10%new_value += divisorreturn new_value

构建倒残差块

def make_layer(self, out_channels, num_blocks, stride, expand_ratio):
"""Stack InvertedResidual blocks to build a layer for MobileNetV2.Args:out_channels (int): out_channels of block.num_blocks (int): number of blocks.stride (int): stride of the first block. Default: 1expand_ratio (int): Expand the number of channels of thehidden layer in InvertedResidual by this ratio. Default: 6."""layers = []for i in range(num_blocks):if i >= 1:stride = 1 # stride 只在堆叠的残差块的第一个残差块会变化,其他的都为1layers.append(InvertedResidual(self.in_channels,   out_channels,   mid_channels=int(round(self.in_channels * expand_ratio)),  # 中间升维后的通带数stride=stride,with_expand_conv=expand_ratio != 1,conv_cfg=self.conv_cfg,norm_cfg=self.norm_cfg,act_cfg=self.act_cfg,with_cp=self.with_cp))self.in_channels = out_channels     # 最后输出通道数等于输入通道数return nn.Sequential(*layers)

特征提取网络之mobilenet相关推荐

  1. 基于并行附加特征提取网络的SSD地面小目标检测模型

    人工智能技术与咨询 来源:<电子学报> ,作者李宝奇等 摘 要: 针对SSD原始附加特征提取网络(Original Additional Feature Extraction Networ ...

  2. yolov4源码_YOLOv4特征提取网络——CSPDarkNet结构解析及PyTorch实现

    1 YOLOv4目标检测模型 自从Redmon说他不在更新YOLO系列之后,我一度以为这么好用的框架就要慢慢淡入历史了,事实是我多虑了.YOLOv4在使用YOLO Loss的基础上,使用了新的back ...

  3. 【YOLOV4】(7) 特征提取网络代码复现(CSPDarknet53+SPP+PANet+Head),附Tensorflow完整代码

    各位同学好,今天和大家分享一下如何使用 TensorFlow 构建YOLOV4目标检测算法的特征提取网络. 完整代码在我的Gitee中,有需要的自取:https://gitee.com/dgvv4/y ...

  4. 小白入门计算机视觉系列——ReID(二):baseline构建:基于PyTorch的全局特征提取网络(Finetune ResNet50+tricks)

    ReID(二):baseline构建:基于PyTorch的全局特征提取网络(Finetune ResNet50+tricks) 本次带来的是计算机视觉中比较热门的重点的一块,行人重识别(也叫Perso ...

  5. YOLOX加强特征提取网络Panet分析

    在上一篇文章中,分享了YOLOX的CSPDarknet网络,详见YOLOX backbone--CSPDarknet的实现 在CSPDarknet中,有三个层次的输出, 分别是dark5(20x20x ...

  6. 深度学习方法(十四):轻量级CNN网络设计——MobileNet,ShuffleNet,文末有思考

    本系列前面介绍了非常多卷积网络结构设计,事实上,在inception和resnet网络提出并相对完善以后,网络结构的设计就不再爆发式出现了,这两大类网路涵盖了大部分应用的卷积网络结构. 在本文中,我们 ...

  7. 深度学习目标检测 RCNN F-RCNN SPP yolo-v1 v2 v3 残差网络ResNet MobileNet SqueezeNet ShuffleNet

    深度学习目标检测--结构变化顺序是RCNN->SPP->Fast RCNN->Faster RCNN->YOLO->SSD->YOLO2->Mask RCNN ...

  8. 损失函数及特征提取网络

    损失函数 Faster Rcnn损失函数:https://blog.csdn.net/Mr_health/article/details/84970776 SSD损失函数:https://www.cn ...

  9. Attention is all your need 谷歌的超强特征提取网络——Transformer

    过年放了七天假,每年第一件事就是立一个flag--希望今年除了能够将技术学扎实之外,还希望能够将所学能够用来造福社会,好像flag立得有点大了.没关系,套用一句电影台词为自己开脱一下--人没有梦想,和 ...

最新文章

  1. Error when running Swift3 in REPL
  2. 数组-丢失的数字(哈希表法)
  3. WP7 App性能优化(8):检测应用程序性能(Ⅰ)
  4. python socket recvfrom_Python socket学习笔记(一)
  5. java 线性表的表示和实现_线性表中顺序表的的理解和实现(java)
  6. [Linux C]重启设备(系统)
  7. codeforces 848B Rooter's Song 思维题
  8. Leetcode每日一题:989.add-to-array-form-of-integer(数组形式的整数加法)
  9. 山寨笔记本电脑风暴要来了
  10. 02 ZooKeeper分布式集群安装
  11. react 逆地理 高德地图_给高德新版地图点赞!出行服务竟然如此智能
  12. 仓库货位 mysql_Max(TM)财务进销存管理系统 V1.1.12 MySQL网络版
  13. 如何做好公司固定资产管理?如何管理企业的固定资产
  14. 大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之1.Hadoop简介及Apache Hadoop完全分布式集群搭建
  15. MyBatis的插件
  16. SpringAOP的实现原理
  17. android 程序控制开关飞行模式,android开关飞行模式的方法
  18. js判断域名是否是合法http/https
  19. 阿里云ECS上使用docker搭建filebeat+kafka集群+zookeep集群+logstash+elasticsearch集群+kibana实现跨主机日志收集系统【四】
  20. python显示gif图片报错_4种方法(plglet、tkinter、guizero、pygame)的GUI中显示gif

热门文章

  1. 《抽象代数极简教程》全书目录 / By 禅与计算机程序设计艺术ChatGPT
  2. 安卓手机USB共享网络步骤
  3. 12306 中铁银通卡积分,积分受让人
  4. msvcr120.dll丢失如何修复?msvcr120.dll丢失修复方法
  5. 老男孩Python全栈开发(92天全)视频教程 自学笔记09
  6. 数据基础——如何辨别虚假流量
  7. mtk case 搜索
  8. Recuva(汉化),U盘数据恢复,电脑数据恢复,免费,免费,免费!!!
  9. android 平板怎么截图,iPad如何截图?截屏保存在什么地方?如何传到电脑上?
  10. 基于jsp设计的童装商城系统