MobileNetV1详细原理(含torch源码)

这篇具有很好参考价值的文章主要介绍了MobileNetV1详细原理(含torch源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MobileNetV1详细原理(含torch源码)

目录

MobileNetV1原理

MobileNet V1的网络结构如下:

为什么要设计MobileNet:

MobileNetV1的主要特点如下:

MobileNetV1的创新点:

MobileNetV1源码(torch版)

训练10个epoch的效果


MobileNetV1原理

        MobileNet V1是一种轻量级的卷积神经网络,能够在保持较高准确率的情况下具有较少的参数量和计算时间。它是由Google的研究人员在2017年提出的,并成为当时最流行的轻量级模型之一。

        MobileNet V1的核心思想是通过深度分离卷积来减少模型的参数量和计算时间。与标准卷积不同,深度分离卷积将空间卷积和通道卷积分为两个独立的卷积层,这使得网络更加高效。具体来说,在深度分离卷积中,首先使用一个空间卷积,然后使用一个通道卷积来提取特征。这与标准卷积相比可以减少参数数量并加速运算。

MobileNet V1的网络结构如下:

MobileNetV1详细原理(含torch源码)

        MobileNet V1由序列卷积和1x1卷积两个部分组成。序列卷积包括13个深度可分离卷积层,每个层都包括一个3x3的卷积和一个批量归一化层(BN层),并且在卷积之后使用了ReLU6激活函数。最后,1x1卷积层用于生成最终的特征向量,并使用全局平均池化来缩小特征图的大小。在最后一层之后,使用一个全连接层来进行分类。MobileNet V1可以根据需要使用不同的输入分辨率,其超参数取决于输入分辨率和需要的精度。

为什么要设计MobileNet:

        Mobilenetv1是一种轻量级的深度神经网络模型,设计的目的是在保持较高的精度的同时减小模型的大小和计算量,使其适合于移动设备的推理任务。在过去,大部分深度神经网络模型都是基于卷积神经网络(CNN)进行设计的,这些模型往往非常庞大(比如VGG16/VGG19),因此不能直接应用于手机或其他嵌入式设备上。同时,运行这些大型模型所需要的计算资源也很昂贵。

        为了解决这个问题,Google Brain团队提出了Mobilenetv1。Mobilenetv1是基于深度可分离卷积(depthwise separable convolution)的设计,它将标准的卷积层分成深度卷积层和逐点卷积层两个部分,用较少的参数和计算量达到了相当不错的准确率。具体来说,深度卷积层用于在每个通道上执行空间卷积,而逐点卷积层(Pointwise Convolution)用于在不同通道之间执行线性变换。这种设计可以减少计算量和模型大小,并使得Mobilenetv1在移动设备上能够运行得更快。

        除此之外,Mobilenetv1还使用了其他一些技巧来进一步缩小模型。例如,通过扩张系数(expansion factor)来控制输出通道数和输入通道数之间的关系,从而精细控制模型的大小和复杂度;通过残差连接(Residual Connection)来提高信息流动,从而提高模型的准确性和训练速度。

        综合来说,Mobilenetv1是一种非常出色的深度神经网络模型,它在保持较高精确度的同时,大大减小了模型大小和计算量,使得它更容易嵌入到移动和嵌入式设备中。

MobileNetV1的主要特点如下:

  1. 轻量级:MobileNetv1的模型参数量非常少,只有4.2M,比起其他深度神经网络模型如VGG16、ResNet等模型,模型大小大大减小,更适合移动设备等资源受限环境下进行应用。

  2. 深度可分离卷积:MobileNetv1主要使用了深度可分离卷积,即将标准卷积分解成一个深度卷积和一个逐点卷积两个部分,分离后分别进行卷积操作,可以大大减少计算量和参数数量,从而实现轻量化的目的。

  3. 使用卷积核大小为1x1的卷积层和全局平均池化层:MobileNetv1使用了大量的1x1卷积层和全局平均池化层来代替传统的卷积层,可以减少特征图的空间尺寸,从而减少计算量和参数数量。

  4. 加入线性层和ReLU6激活函数:为了减少梯度消失的现象,MobileNetv1在每个深度可分离卷积结构后加入一个线性层和ReLU6激活函数,同时提高模型的非线性能力。

  5. 高性能:MobileNetv1在性能表现方面也做得很好,准确率达到了当时的state-of-the-art水平,同时模型具有高效率的特点,能够在较短的时间内完成较为复杂的任务。

MobileNetV1的创新点:

  1. Depthwise Separable Convolution(深度可分离卷积)

        MobileNetV1使用Depthwise Separable Convolution代替了传统的卷积操作。Depthwise Separable Convolution分为两个步骤,首先进行深度卷积,然后进行点卷积。深度卷积可以在每个输入通道上进行滤波操作,而点卷积使用1×1卷积来对每个通道进行线性组合。这样可以减少运算量以及减小模型的大小,同时也可以提高模型的精度和鲁棒性。

     2. Width Multiplier(宽度乘法参数)

        MobileNetV1引入了width multiplier的概念,可以通过调整宽度乘数来控制模型的大小和计算量。宽度乘数是作用于每一层的通道数目,可以取0到1的任意值。当宽度乘数为1时,模型与原始模型一致,而当宽度乘数小于1时,模型会变得更轻巧。

     3. Global Depthwise Pooling(全局深度池化)

        MobileNetV1使用Global Depthwise Pooling代替了全连接层。全局深度池化是在每个通道上进行求和操作,并将结果作为输出。这样可以有效地减少模型的参数量和计算量,提高模型的速度和精度。

MobileNetV1详细原理(含torch源码)

        总的来说,MobileNetV1在模型轻量化方面具有显著的创新,可以在计算资源有限的设备上进行高效的推理操作,成为了移动设备上的高效神经网络模型。

MobileNetV1源码(torch版)

数据集运行代码时自动下载,如果网络比较慢,可以自行点击我分享的链接下载cifar数据集。

链接:百度网盘
提取码:kd9a 

# -*- coding: utf-8 -*-
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from torchvision.datasets import CIFAR10
from torchvision.transforms import transforms
from torch.autograd import Variable


class DepthwiseSeparableConv(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(DepthwiseSeparableConv, self).__init__()

        self.depthwise_conv = nn.Conv2d(in_channels, in_channels, kernel_size=3, padding=1, groups=in_channels)
        self.pointwise_conv = nn.Conv2d(in_channels, out_channels, kernel_size=1)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        x = self.depthwise_conv(x)
        x = self.pointwise_conv(x)
        x = self.relu(x)
        return x


class MobileNetV1(nn.Module):
    def __init__(self, num_classes=1000):
        super(MobileNetV1, self).__init__()

        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, stride=2, padding=1)
        self.relu = nn.ReLU(inplace=True)

        self.dw_separable_conv1 = DepthwiseSeparableConv(32, 64)
        self.dw_separable_conv2 = DepthwiseSeparableConv(64, 128)
        self.dw_separable_conv3 = DepthwiseSeparableConv(128, 128)
        self.dw_separable_conv4 = DepthwiseSeparableConv(128, 256)
        self.dw_separable_conv5 = DepthwiseSeparableConv(256, 256)
        self.dw_separable_conv6 = DepthwiseSeparableConv(256, 512)
        self.dw_separable_conv7 = DepthwiseSeparableConv(512, 512)
        self.dw_separable_conv8 = DepthwiseSeparableConv(512, 512)
        self.dw_separable_conv9 = DepthwiseSeparableConv(512, 512)
        self.dw_separable_conv10 = DepthwiseSeparableConv(512, 512)
        self.dw_separable_conv11 = DepthwiseSeparableConv(512, 512)
        self.dw_separable_conv12 = DepthwiseSeparableConv(512, 1024)
        self.dw_separable_conv13 = DepthwiseSeparableConv(1024, 1024)

        self.avg_pool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = nn.Linear(1024, num_classes)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu(x)

        x = self.dw_separable_conv1(x)
        x = self.dw_separable_conv2(x)
        x = self.dw_separable_conv3(x)
        x = self.dw_separable_conv4(x)
        x = self.dw_separable_conv5(x)
        x = self.dw_separable_conv6(x)
        x = self.dw_separable_conv7(x)
        x = self.dw_separable_conv8(x)
        x = self.dw_separable_conv9(x)
        x = self.dw_separable_conv10(x)
        x = self.dw_separable_conv11(x)
        x = self.dw_separable_conv12(x)
        x = self.dw_separable_conv13(x)

        x = self.avg_pool(x)
        x = torch.flatten(x, 1)
        x = self.fc(x)

        return x
def main():
    train_data = CIFAR10('cifar',train=True,transform = transforms.ToTensor())
    data = DataLoader(train_data,batch_size=128,shuffle=True)

    device = torch.device("cuda")
    net = MobileNetV1(num_classes=10).to(device)
    print(net)
    cross = nn.CrossEntropyLoss().to(device)
    optimizer = torch.optim.Adam(net.parameters(),0.001)
    for epoch in range(10):
        for img,label in data:
            img = Variable(img).to(device)
            label = Variable(label).to(device)
            output = net.forward(img)
            loss = cross(output,label)
            loss.backward()
            optimizer.zero_grad()
            optimizer.step()
            pre = torch.argmax(output,1)
            num = (pre == label).sum().item()
            acc = num / img.shape[0]
        print("epoch:",epoch + 1)
        print("loss:",loss.item())
        print("acc:",acc)
    pass


if __name__ == '__main__':
    main()

        上述代码中,我使用的是CIFAR-10数据集,通过训练MobileNet V1对图像进行分类。在训练过程中,我使用Adam优化器和交叉熵损失函数,并在训练后使用验证集评估模型的性能。

        其中,模型中使用了Depthwise Separable Convolution,它包含一层深度卷积和一层1x1卷积。深度卷积用于处理输入数据的不同通道,1x1卷积用于将不同通道的特征图合并成更多的通道。这个操作可以有效地减少参数数量和计算量,并提高模型的性能。

        另外,模型还使用了AdaptiveAvgPool2d,该层可以自适应地将输入特征图的大小调整为任意大小,并对每个子区域进行平均池化操作。这可以使模型对输入图像的尺寸具有更强的鲁棒性。

        通过MobileNet V1,我们可以在保持较高精度的同时具有较少的参数量和计算时间,在计算资源受限的情况下尤其有用。

训练10个epoch的效果

MobileNetV1详细原理(含torch源码)文章来源地址https://www.toymoban.com/news/detail-418184.html

到了这里,关于MobileNetV1详细原理(含torch源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【RT-DETR有效改进】轻量化CNN网络MobileNetV1改进特征提取网络

    👑欢迎大家订阅本专栏,一起学习RT-DETR👑     本篇文章给大家带来的改进机制是 MobileNetV1 ,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其 引入了两个简单的全局超参数 ,用于在延

    2024年01月19日
    浏览(47)
  • MobileNetV2原理说明及实践落地

    本文参考: 轻量级网络——MobileNetV2_Clichong的博客-CSDN博客_mobilenetv2 MobileNetV1主要是提出了可分离卷积的概念,大大减少了模型的参数个数,从而缩小了计算量。但是在CenterNet算法中作为BackBone效果并不佳,模型收敛效果不好导致目标检测的准确率不高。 MobileNetV2在MobileNetV1的

    2024年02月08日
    浏览(40)
  • YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析

    前面简单介绍了YOLOv5的网络结构和创新点(直通车:【YOLO系列】YOLOv5超详细解读(网络详解)) 在接下来我们会进入到YOLOv5更深一步的学习,首先从源码解读开始。 因为我是纯小白,刚开始下载完源码时真的一脸懵,所以就先从最基础的 项目目录结构 开始吧~因为相关解读

    2024年02月03日
    浏览(52)
  • 遗传算法原理详细讲解(算法+Python源码)

    博主介绍:✌专研于前后端领域优质创作者、本质互联网精神开源贡献答疑解惑、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战,深受全网粉丝喜爱与支持✌有需要可以联系作者我哦! 🍅文末获取源码联系🍅 👇🏻 精彩专栏

    2024年01月25日
    浏览(49)
  • ResNet18详细原理(含tensorflow版源码)

            ResNet18是一个经典的深度卷积神经网络模型,由微软亚洲研究院提出,用于参加2015年的ImageNet图像分类比赛。ResNet18的名称来源于网络中包含的18个卷积层。 ResNet18的基本结构如下: 输入层:接收大小为224x224的RGB图像。 卷积层:共4个卷积层,每个卷积层使用3x3的卷积

    2024年02月04日
    浏览(33)
  • VGG16详细原理(含tensorflow版源码)

            VGG16是一个经典的卷积神经网络模型,由牛津大学计算机视觉组(Visual Geometry Group)提出,用于参加2014年的ImageNet图像分类比赛。VGG16的名称来源于网络中包含的16个卷积层,其基本结构如下: 输入层:接收大小为224x224的RGB图像。 卷积层:共13个卷积层,每个卷积

    2024年02月05日
    浏览(38)
  • Darknet19详细原理(含tensorflow版源码)

            Darknet19是一个轻量级的卷积神经网络,用于图像分类和检测任务。 它是YOLOv2目标检测算法的主干网络,它的优点在于具有较少的参数和计算量,在计算速度和精度之间取得了良好的平衡,同时在训练过程中也具有较高的准确率和收敛速度。         Darknet19主要

    2023年04月22日
    浏览(32)
  • Vue项目中axios的原理(详细到源码)

    关于 axios 的基本使用,上篇文章已经有所涉及,这里再稍微回顾下: 构建一个 Axios 构造函数,核心代码为 request 导出 axios 实例 上述就已经能够实现 axios({ }) 这种方式的请求 下面是来实现下 axios.method() 这种形式的请求 将 Axios.prototype 上的方法搬运到 request 上 首先实现个工

    2024年01月20日
    浏览(78)
  • Springboot中SpringSecurity自动装配原理,源码级别绝对详细

    (1)Springboot有一个自动配置类 SecurityFilterAutoConfiguration , SecurityFilterAutoConfiguration 只要当项目中引入了SpringSecurity的相关jar包就会被自动加载。装载这个类是干嘛的呢? (2)如下图, SecurityFilterAutoConfiguration 自动配置类主要用于,当存在名字叫做\\\"springSecurityFilterChain\\\"的bea

    2024年02月05日
    浏览(51)
  • 详细解读Java中Map集合的底层原理(干货+源码解读)

    本文将为大家详细讲解Java中的Map集合,这是我们进行开发时经常用到的知识点,也是大家在学习Java中很重要的一个知识点,更是我们在面试时有可能会问到的问题。 文章较长,干货满满,建议大家收藏慢慢学习。文末有本文重点总结,主页有全系列文章分享。技术类问题,

    2024年02月06日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包