pytorh学习笔记——cifar10(六)MobileNet V1网络结构

news2024/10/25 22:10:56

基础知识储备:

一、深度可分离卷积(Depthwise Separable Convolution)       

        MobileNet的核心是深度可分离卷积(Depthwise Separable Convolution),深度可分离卷积是卷积神经网络(CNN)中一种高效的卷积操作,主要用于降低计算复杂度和模型参数数量。它由两个独立的步骤组成:深度卷积和逐点卷积。这种方法是 MobileNet、Xception 等轻量级神经网络架构的核心组成部分。
下面是对深度可分离卷积的详细解析。
1. 标准卷积回顾
        在标准卷积中,卷积操作涉及到同时对所有输入通道进行卷积,输出为每个通道的加权和。假设输入特征图有 C_in个通道,输出特征图有 C_out 个通道,卷积核大小为 (K),则计算的复杂度为:
FLOPs (Floating Point Operations):浮点运算次数
FLOPs = H*W* K*K*C_in*C_out 
其中 (H) 和 (W) 是输入特征图的高度和宽度。
2. 深度卷积(Depthwise Convolution)
        深度卷积对每个输入通道单独进行卷积操作,即对于每个输入通道,单独使用一个卷积核。对于深度卷积,每个输入通道使用一个独立的卷积核进行卷积,亦即使用 C_in个的卷积核处理 C_in个输入通道,卷积核大小为K*K,由于输入是 H*W像素,有C_in 个通道,所以:
FLOPs = H*W* K*K*C_in 
3. 逐点卷积(Pointwise Convolution)
        逐点卷积是用 (1*1) 的卷积核对深度卷积的输出进行处理,结合所有的通道信息。逐点卷积的输入是深度卷积的输出,输出是设置的输出通道数。
逐点卷积的 FLOPs = H*W* 1*1*C_in*C_out
4. 深度可分离卷积的整合
        深度可分离卷积就是将上述两个步骤整合在一起。首先通过深度卷积进行特征提取,然后通过逐点卷积进行通道的融合。这种方法在保留大部分信息的同时,极大地减少了计算负担和模型参数。深度可分离卷积与标准卷积的网络结构对比图:


5. 计算复杂度比较
        例如,有一个卷积层H=10,W=10,K=3,C_in=3, C_out=10,
        那么标准卷积的FLOPs = H*W* K*K*C_in*C_out=10*10*3*3*3*10=27000 。这表示在这个卷积层中大约需要进行 27000 次浮点运算。
        深度可分离卷积的FLOPs分为两部分:深度卷积的 FLOPs和逐点卷积的 FLOPs。
        深度卷积的 FLOPs = H*W* K*K*C_in=10*10*3*3*3=2700
        逐点卷积的 FLOPs = H*W* 1*1*C_in*C_out=10*10*1*1*3*10=3000
        深度可分离卷积的总的FLOPs = 2700+3000=5700
        简而言之,深度可分离卷积的计算复杂度显著低于标准卷积。
6. 结论
        深度可分离卷积是一种高效的卷积操作,能够在确保分类准确率的同时,显著减少计算量和模型大小。这使得它在移动端和嵌入式设备上的应用极具吸引力,是许多现代轻量级神经网络的基础。

二、MobileNet

        MobileNet是一种深度学习模型,专门设计用于在移动设备和嵌入式设备上进行高效的图像分类和目标检测。它是在2017年由 Google 提出的,旨在在保持较高准确率的同时,减少计算资源消耗和模型大小,从而实现快速的推理。

1. 设计背景
        移动设备的需求:随着机器学习的普及,特别是在移动设备上的应用,需要一种轻量级的神经网络,以便在处理能力有限的设备上执行模型。
准确性与效率的权衡:MobileNet V1 试图在模型大小、速度和准确率之间找到一个良好的平衡点。
2. 主要构建模块
        MobileNet V1 的核心思想是使用深度可分离卷积(Depthwise Separable Convolution),这一操作把标准卷积分解为两步:
深度卷积(Depthwise Convolution):对每个输入通道单独执行卷积操作。
逐点卷积(Pointwise Convolution):使用 1x1 卷积来结合深度卷积的输出。
这种方法大大减少了计算量和参数数量,从而提高了模型的效率。
3. 模型架构
        MobileNet V1 的基本结构如下:
        输入层:接收输入图像,通常为 224x224 像素大小及 RGB 通道。
        标准卷积层:初始的标准卷积层,用于提取基础特征。
        深度可分离卷积层:多个 stacked layers,通过大量的深度可分离卷积层进行特征提取,每层由深度卷积和逐点卷积组成。
        全局平均池化:在最后一层以全局平均池化来减少模型的大小。
        全连接层:最后的全连接层,用于分类。
4. 计算复杂度
        MobileNet V1 通过引入深度可分离卷积显著降低了模型的计算复杂度。
FLOPs(每秒浮点运算次数):在输入为 224x224x3 图像时,MobileNet V1 的 FLOPs 约为 569 万,显著低于许多其他主流模型。MobileNet V1 的参数数量也相对较少,约在 4-6 百万之间,具体取决于使用的宽度乘子(Width Multiplier)。
5. 应用领域
        MobileNet V1 已经广泛应用于各种计算机视觉任务,包括:
        图像分类
        物体检测(与 SSD 等方法结合使用)
        实时图像分析
        视频处理
6. 结论
        MobileNet V1 为在计算资源有限的环境中应用深度学习提供了一种有效的解决方案。其引入的深度可分离卷积成为了轻量级网络设计中的一项重要技术,并极大地影响了后续轻量级模型的设计,如 MobileNet V2 和 MobileNet V3。

代码实现:

新建mobileNet.py

import torch
import torch.nn as nn
import torch.nn.functional as F


class MobileNet(nn.Module):
    def conv_dw(self, in_channels, out_channels, stride):  # 定义深度可分离卷积
        return nn.Sequential(  # Sequential是一个容器,它可以包含一系列的神经网络层(layers),并按顺序执行它们
            nn.Conv2d(in_channels, in_channels, kernel_size=3,  # 定义深度卷积
                      stride=stride, padding=1, groups=in_channels, bias=False),
            nn.BatchNorm2d(in_channels),
            nn.ReLU(),

            nn.Conv2d(in_channels, out_channels, kernel_size=1,  # 定义逐点卷积,卷积核是1*1
                      stride=1, padding=0, bias=False),
            nn.BatchNorm2d(out_channels),
            nn.ReLU()

        )

    def __init__(self, num_classes=10):
        super(MobileNet, self).__init__()
        self.conv1 = nn.Sequential(  # 定义第1个卷积层
            nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1),  # 输入通道为3,输出通道为32,卷积核大小为3x3,步长为1,填充为1
            nn.BatchNorm2d(32),  # 批量归一化
            nn.ReLU()  # 激活函数
        )

        self.conv2_1 = self.conv_dw(32, 32, 1)  # 定义第2个卷积层的第一次卷积
        self.conv2_2 = self.conv_dw(32, 64, 2)  # 定义第2个卷积层的第二次卷积

        self.conv2_3 = self.conv_dw(64, 64, 1)  # 定义第2个卷积层的第三次卷积
        self.conv2_4 = self.conv_dw(64, 128, 2)  # 定义第2个卷积层的第四次卷积

        self.conv2_5 = self.conv_dw(128, 128, 1)  # 定义第2个卷积层的第五次卷积
        self.conv2_6 = self.conv_dw(128, 256, 2)  # 定义第2个卷积层的第六次卷积

        self.conv2_7 = self.conv_dw(256, 256, 1)  # 定义第2个卷积层的第七次卷积
        self.conv2_8 = self.conv_dw(256, 512, 2)  # 定义第2个卷积层的第八次卷积

        self.fc = nn.Linear(512, num_classes)  # 全连接层

    def forward(self, x):  # 定义前向传播
        out = self.conv1(x)  # 第1个卷积层
        out = self.conv2_1(out)  # 第2个卷积层的第一次卷积
        out = self.conv2_2(out)  # 第2个卷积层的第二次卷积
        out = self.conv2_3(out)  # 第2个卷积层的第三次卷积
        out = self.conv2_4(out)  # 第2个卷积层的第四次卷积
        out = self.conv2_5(out)  # 第2个卷积层的第五次卷积
        out = self.conv2_6(out)  # 第2个卷积层的第六次卷积
        out = self.conv2_7(out)  # 第2个卷积层的第七次卷积
        out = self.conv2_8(out)  # 第2个卷积层的第八次卷积
        out = F.avg_pool2d(out, 2)  # 最大池化,池化核大小为2,out2,步长为2
        out = out.view(-1, 512)  # 将特征图展开
        out = self.fc(out)  # 全连接层
        return out


def mobilenetv1_small():
    return MobileNet()


if __name__ == '__main__':
    net = MobileNet()
    print(net)
    input = torch.randn(1, 3, 32, 32)
    out = net(input)
    print(out.size())

用新建的MobileNet网络进行训练 

        同样的,将之前的train.py脚本中的
        net = resnet().to(device),改为:
        net =mobilenetv1_small().to(device),即可运行开始训练:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2223586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低代码开发详解与行业应用指南

低代码开发简化软件开发,助力企业数字化转型。ZohoCreator应用于零售、制造、教育、IT、医疗、房地产等行业,提升效率、降低成本。灵活定价,支持免费试用,助力企业快速实现数字化。 一、低代码开发是什么? 低代码开发…

CSS3 动画相关属性实例大全(三)(columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性)

CSS3 动画相关属性实例大全(三) (columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性) 本文目录: 一、columns属性(设置元素的列宽和列数) 二、filter属性(调整图像、背景和边…

打造充电场站:场地选择与合规运营详解

建设一座充电站需要六步流程:准备工作 → 备案 → 土地审核 → 规划审核 → 电力申请 → 验收确认 一、准备工作 在确定建设前,要考察待选的场地,例如空地、停车场等,与场地所有方签订充电站建设合作协议。根据场地和车流量等实际…

Docker 部署 EMQX 一分钟极速部署

部署 EMQX ( Docker ) [Step 1] : 拉取 EMQX 镜像 docker pull emqx/emqx:latest[Step 2] : 创建目录 ➡️ 创建容器 ➡️ 拷贝文件 ➡️ 授权文件 ➡️ 删除容器 # 创建目录 mkdir -p /data/emqx/{etc,data,log}# 创建容器 docker run -d --name emqx -p 1883:1883 -p 1808…

H7-TOOL的LUA小程序教程第15期:电压,电流,NTC热敏电阻以及4-20mA输入(2024-10-21,已经发布)

LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用&#xff…

在矩池云使用智谱情感语音模型GLM-4-Voice,详细指南

GLM-4-Voice 是智谱 AI 推出的端到端语音模型。GLM-4-Voice 能够直接理解和生成中英文语音,进行实时语音对话,并且能够遵循用户的指令要求改变语音的情感、语调、语速、方言等属性。 本文将详细介绍,如何在GPU算力租赁平台矩池云上快速复现、…

MongoDB安装配置及配置和启动服务

MongoDB 安装配置 附:MongoDB官网下载地址: https://www.mongodb.com/download-center/community 注: 官网可以下载最新版的MongoDB安装包,有MSI安装版和ZIP安装版。我们课堂上使用4.4.4的ZIP安装版。安装版参考博客&#xff1…

使用rust实现类似C#中的Convert数据转换类

// 编写一个模块&#xff08;好比是C#的一个类&#xff09; pub mod Convert {// 定义函数&#xff08;好比C#中的方法&#xff09;pub fn ToInt32(s:&str) -> i32 {s.parse::<i32>().unwrap()}pub fn ToInt64(s:&str) -> Result<i64,std::num::ParseIn…

Maven入门到实践:从安装到项目构建与IDEA集成

目录 1. Maven的概念 1.1 什么是Maven 1.2 什么是依赖管理 1.3 什么是项目构建 1.4 Maven的应用场景 1.5 为什么使用Maven 1.6 Maven模型 2.初识Maven 2.1 Maven安装 2.1.1 安装准备 2.1.2 Maven安装目录分析 2.1.3 Maven的环境变量 2.2 Maven的第一个项目 2.2.1…

AUTOSAR CP 中 BswM 模块功能与使用介绍(2/2)

三、 AUTOSAR BswM 模块详解及 ARXML 示例 BswM 模块的主要功能 BswM&#xff08;Basic Software Mode Manager&#xff09;模块在 AUTOSAR 架构中扮演着模式管理的核心角色。它负责管理车辆的各种模式&#xff08;如启动、运行、停车等&#xff09;&#xff0c;并根据不同的…

stm32入门教程--ADC模拟-数字转换器

ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转你换位内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁。 12位逐次逼近型ADC&#xff0c;1us转换时间 输入电压范围&#xff1a;0-3.3V转换结果范围…

MCK主机加固与防漏扫的深度解析

在当今这个信息化飞速发展的时代&#xff0c;网络安全成为了企业不可忽视的重要议题。漏洞扫描&#xff0c;简称漏扫&#xff0c;是一种旨在发现计算机系统、网络或应用程序中潜在安全漏洞的技术手段。通过自动化工具&#xff0c;漏扫能够识别出系统中存在的已知漏洞&#xff0…

基于大型语言模型的智能网页抓取

Google Gemini 是 Google AI 创建的大型语言模型 (LLM) 系列&#xff0c;可提供最先进的 AI 功能。Gemini 模型包括&#xff1a; Gemini Ultra — 最大、最强大的模型&#xff0c;擅长处理编码、逻辑推理和创意协作等复杂任务。可通过 Gemini Advanced&#xff08;原名 Bard&a…

使用QT绘图控件QCustomPlot绘制波形图

使用QT绘图控件QCustomPlot绘制波形图 下载QCustomPlot 下载QCustomPlot,链接路径 解压之后就能看到源代码了 在Qt中添加QCustomPlot的帮助文档 在Qt Creator的菜单:工具–>选项–>帮助–>文档–>添加qcustomplot\documentation\qcustomplot.qch文件。

《PP-OCRv1》论文精读:PaddleOCR是目前SOTA级别的OCR开源技术(截止2024年10月)

PP-OCR: A Practical Ultra Lightweight OCR System论文地址PP-OCRv2: Bag of Tricks for Ultra Lightweight OCR System论文地址PP-OCRv3: More Attempts for the Improvement of Ultra Lightweight OCR System论文地址PaddleOCR Github OCR工具库 43.5K个star PP-OCRv1由百度…

CMU生成式人工智能大模型:从入门到放弃(四)

引言 在之前的系列博客中&#xff0c;我们深入探讨了生成式AI的基础知识、大型语言模型的发展&#xff0c;以及如何通过递归神经网络&#xff08;RNN&#xff09;和Transformer模型来学习语言模型。今天&#xff0c;我们将转向计算机视觉领域&#xff0c;探讨预训练与微调的概…

STM32--SPI原理及应用

1.什么是SPI SPI&#xff0c;Serial Peripheral interface&#xff0c;串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 2.SPI基本特性 SPI&#xff0c;是一种高速全双工的通信总线。广泛地应用在ADC、LCD等设备与MCU间&#xff0c;适用于对通…

微前端架构新选择:micro-app 框架一文全解析

目录 前言技术方案沙箱withiframe 环境变量主应用生命周期子应用生命周期初始化更新卸载缓存 JS 沙箱样式隔离元素隔离路由系统⭐数据通信⭐资源系统预加载umd 模式其他功能调试工具 前言 https://micro-zoe.github.io/micro-app/ micro-app 是由京东前端团队推出的一款微前端…

Qt 支持打包成安卓

1. 打开维护Qt&#xff0c;双击MaintenanceTool.exe 2.登陆进去,默认是添加或移除组件&#xff0c;点击下一步&#xff0c; 勾选Android, 点击下一步 3.更新安装中 4.进度100%&#xff0c;完成安装&#xff0c;重启。 5.打开 Qt Creator&#xff0c;编辑-》Preferences... 6.进…

【力扣】[Java版] 刷题笔记-21. 合并两个有序链表

题目&#xff1a; 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路 从题目和示例可以看出&#xff0c;应该是要循环遍历链表进行比较&#xff0c;然后组成新的链表。 第一种&#xff1a;递归…