特征提取网络之mobilenet
文章目录
- 前言
- 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相关推荐
- 基于并行附加特征提取网络的SSD地面小目标检测模型
人工智能技术与咨询 来源:<电子学报> ,作者李宝奇等 摘 要: 针对SSD原始附加特征提取网络(Original Additional Feature Extraction Networ ...
- yolov4源码_YOLOv4特征提取网络——CSPDarkNet结构解析及PyTorch实现
1 YOLOv4目标检测模型 自从Redmon说他不在更新YOLO系列之后,我一度以为这么好用的框架就要慢慢淡入历史了,事实是我多虑了.YOLOv4在使用YOLO Loss的基础上,使用了新的back ...
- 【YOLOV4】(7) 特征提取网络代码复现(CSPDarknet53+SPP+PANet+Head),附Tensorflow完整代码
各位同学好,今天和大家分享一下如何使用 TensorFlow 构建YOLOV4目标检测算法的特征提取网络. 完整代码在我的Gitee中,有需要的自取:https://gitee.com/dgvv4/y ...
- 小白入门计算机视觉系列——ReID(二):baseline构建:基于PyTorch的全局特征提取网络(Finetune ResNet50+tricks)
ReID(二):baseline构建:基于PyTorch的全局特征提取网络(Finetune ResNet50+tricks) 本次带来的是计算机视觉中比较热门的重点的一块,行人重识别(也叫Perso ...
- YOLOX加强特征提取网络Panet分析
在上一篇文章中,分享了YOLOX的CSPDarknet网络,详见YOLOX backbone--CSPDarknet的实现 在CSPDarknet中,有三个层次的输出, 分别是dark5(20x20x ...
- 深度学习方法(十四):轻量级CNN网络设计——MobileNet,ShuffleNet,文末有思考
本系列前面介绍了非常多卷积网络结构设计,事实上,在inception和resnet网络提出并相对完善以后,网络结构的设计就不再爆发式出现了,这两大类网路涵盖了大部分应用的卷积网络结构. 在本文中,我们 ...
- 深度学习目标检测 RCNN F-RCNN SPP yolo-v1 v2 v3 残差网络ResNet MobileNet SqueezeNet ShuffleNet
深度学习目标检测--结构变化顺序是RCNN->SPP->Fast RCNN->Faster RCNN->YOLO->SSD->YOLO2->Mask RCNN ...
- 损失函数及特征提取网络
损失函数 Faster Rcnn损失函数:https://blog.csdn.net/Mr_health/article/details/84970776 SSD损失函数:https://www.cn ...
- Attention is all your need 谷歌的超强特征提取网络——Transformer
过年放了七天假,每年第一件事就是立一个flag--希望今年除了能够将技术学扎实之外,还希望能够将所学能够用来造福社会,好像flag立得有点大了.没关系,套用一句电影台词为自己开脱一下--人没有梦想,和 ...
最新文章
- Error when running Swift3 in REPL
- 数组-丢失的数字(哈希表法)
- WP7 App性能优化(8):检测应用程序性能(Ⅰ)
- python socket recvfrom_Python socket学习笔记(一)
- java 线性表的表示和实现_线性表中顺序表的的理解和实现(java)
- [Linux C]重启设备(系统)
- codeforces 848B Rooter's Song 思维题
- Leetcode每日一题:989.add-to-array-form-of-integer(数组形式的整数加法)
- 山寨笔记本电脑风暴要来了
- 02 ZooKeeper分布式集群安装
- react 逆地理 高德地图_给高德新版地图点赞!出行服务竟然如此智能
- 仓库货位 mysql_Max(TM)财务进销存管理系统 V1.1.12 MySQL网络版
- 如何做好公司固定资产管理?如何管理企业的固定资产
- 大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之1.Hadoop简介及Apache Hadoop完全分布式集群搭建
- MyBatis的插件
- SpringAOP的实现原理
- android 程序控制开关飞行模式,android开关飞行模式的方法
- js判断域名是否是合法http/https
- 阿里云ECS上使用docker搭建filebeat+kafka集群+zookeep集群+logstash+elasticsearch集群+kibana实现跨主机日志收集系统【四】
- python显示gif图片报错_4种方法(plglet、tkinter、guizero、pygame)的GUI中显示gif
热门文章
- 《抽象代数极简教程》全书目录 / By 禅与计算机程序设计艺术ChatGPT
- 安卓手机USB共享网络步骤
- 12306 中铁银通卡积分,积分受让人
- msvcr120.dll丢失如何修复?msvcr120.dll丢失修复方法
- 老男孩Python全栈开发(92天全)视频教程 自学笔记09
- 数据基础——如何辨别虚假流量
- mtk case 搜索
- Recuva(汉化),U盘数据恢复,电脑数据恢复,免费,免费,免费!!!
- android 平板怎么截图,iPad如何截图?截屏保存在什么地方?如何传到电脑上?
- 基于jsp设计的童装商城系统