探索卷积层参数量与计算量

1 问题

  1. 了解VGG网络并利用PyTorch实现VGG

  2. 探索1x1卷积的作用

  3. 探索卷积层参数量、计算量的计算方法

2 方法

  1. 了解VGG网络并利用PyTorch实现VGG
    1、VGG是Oxford的Visual Geometry Group的组提出的,VGG的缩写也来自于这个组的名字。

    VGG网络探索了提升网络的深度对最终的图像识别准确率的重要性,同时在VGG中尝试使用小的卷积核来构建深层的卷积网络。


    2、利用pytorch实现VGG代码:

    class ResidualBlock(nn.Module):
       def __init__(self, in_planes=64):
           super().__init__()
           self.conv1 = nn.Conv2d(
               in_channels=in_planes, #! Residual模块的输入通道数
               out_channels=64,
               kernel_size=3,
               padding=1,
           )
           self.relu2 = nn.ReLU()
           self.conv3 = nn.Conv2d(
               in_channels=64,
               out_channels=in_planes,
               kernel_size=3,
               padding=1,
           )
           self.relu4 = nn.ReLU()
       def forward(self, x):
           identity = x  
           x = self.conv1(x)
           x = self.relu2(x)
           x = self.conv3(x)
           x = x + identity #! 重点
           x = self.relu4(x)
           return x
    class Network(nn.Module):
       def __init__(self):
           super().__init__()
           self.conv1 = nn.Conv2d(
               in_channels=1,
               out_channels=32,
               kernel_size=3,
               padding=1,
               stride=2,
           )
           self.res_block2 = ResidualBlock(in_planes=32)
           self.conv3 = nn.Conv2d(
               in_channels=32,
               out_channels=64,
               kernel_size=3,
               padding=1,
               stride=2,
           )
           self.res_block4 = ResidualBlock(in_planes=64)
           self.res_block5 = ResidualBlock(in_planes=64)
           self.flatten6 = nn.Flatten()
           self.fc7 = nn.Linear(
               in_features=64*7*7,
               out_features=512,
           )
           self.fc8 = nn.Linear(
               in_features=512,
               out_features=10,
           )
       def forward(self, x):
           x = self.conv1(x)
           x = self.res_block2(x)
           x = self.conv3(x)
           x = self.res_block4(x)
           x = self.res_block5(x)
           x = self.flatten6(x)
           x = self.fc7(x)
           x = self.fc8(x)
           return x
    if __name__ == '__main__':
       x = torch.rand(size=(1, 1, 28, 28))
       net = Network()
       out = net(x)
       print(out.shape)
  2. 探索1x1卷积的作用

1、降维/升维

1x1卷积核可以通过控制卷积核数量实现降维或升维,卷积后的特征图通道数与卷积核的个数是相同的。所以,如果想要升维或降维,只需要通过修改卷积核的个数即可。

2、 跨通道信息交互(通道的变换)

使用1x1卷积核,实现降维和升维的操作其实就是 channel 间信息的线性组合变化。

比如:在尺寸 3x3,64通道个数的卷积核后面添加一个尺寸1x1,28通道个数的卷积核,就变成了尺寸3x3,28尺寸的卷积核。原来的64个通道就可以理解为跨通道线性组合变成了28通道,这就是通道间的信息交互。

3、增加网络深度(增加非线性)

每使用 1x1卷积核,及增加一层卷积层,所以网络深度得以增加。而使用 1x1卷积核后,可以保持特征图大小与输入尺寸相同,卷积层卷积过程会包含一个激活函数,从而增加了非线性。

在输入尺寸不发生改变的情况下而增加了非线性,所以会增加整个网络的表达能力

三、探索卷积层参数量、计算量的计算方法

1、卷积层的参数:

filter,若一个3*3的卷积核,其参数为 9个,再加上通道数,其参数就是:通道数*9

(1)普通卷积层参数计算:

有一张通道为3大小为224∗224的图片,卷积核大小为:2∗2,输出通道数为32,则一个卷积核的参数2∗2∗3=12;则32个卷积核的参数为32∗(2∗2∗3)+32=416,其中最后的32为偏置项参数。

  1. 池化层参数计算:
    池化(Pooling):也称为欠采样或下采样;主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性;pooling在不同的 depth 上是分开执行的,池化操作是分开应用到各个特征图的,因此池化不需要参数控制。

  2. 全连接层参数计算:

例如某一网络最后一层卷积层输出的大小为7∗7∗512,全连接层输出尺寸为 1∗1024;则需卷积层的尺寸为:7∗7∗1024,所以所需参数为512∗7∗7∗1024+1024=25691136。

  1. 卷积层的计算量:

  1. 普通卷积层的计算量
    卷积层计算量 = 卷积矩阵操作 + 融合操作 + 偏置项操作
    若有一张通道为3。大小为7∗7的图片,卷积核大小为:5∗5,stride为1,padding为0,输出通道数为64,其输出feature map的大小为 3∗3∗64,feature map中的每一个像素点,都是64个的5×5×3的filter共同作用于7∗7∗3的图片计算一次得到的。

  2. 全连接层的计算量

若需对7∗7∗512的数据进行全连接操作,其输出尺寸为1∗1024(即1*1024*1*1),其:filter:7∗7∗512 ,则所需计算量为:1024∗(1∗1)∗[(7∗7∗512)+512∗(7∗7−1)+(512−1)]+1024,其中1024为输出通道数,(1∗1)为输出feature map尺寸,7∗7∗512为某一通道feature map中某一像素的矩阵操作乘法的计算量,512∗(7∗7−1)为某一通道feature map中某一像素的矩阵操作加法的计算量,(512−1)为通道融合加法的计算量,最后的 1024 为偏置项操作计算量。

3 结语

针对卷积层参数量、计算量的计算方法, 其中全连接层参数计算参数量巨大,全连接层参数就可占整个网络参数80%左右,所以全连接层参数具有冗余性。

卷积层计算量的计算方法中,矩阵操作先乘法,再加法。在全连接层的计算量中,得知减少网络参数应主要针对全连接层,进行计算量优化时,重点应放在卷积层。

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

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

相关文章

算法的学习笔记—两个链表的第一个公共结点(牛客JZ52)

😀前言 在链表问题中,寻找两个链表的第一个公共结点是一个经典问题。这个问题的本质是在两个单链表中找到它们的相交点,或者说它们开始共享相同节点的地方。本文将详细讲解这个问题的解题思路,并提供一种高效的解决方法。 &#x…

蓝牙资讯|iOS 18.1 正式版下周推送,AirPods Pro 2耳机将带来助听器功能

苹果公司宣布将在下周发布 iOS 18.1 正式版,同时确认该更新将为 AirPods Pro 2 耳机带来新增“临床级”助听器功能。在启用功能后,用户首先需要使用 AirPods 和 iPhone 进行简短的听力测试,如果检测到听力损失,系统将创建一项“个…

docker run 命令解析

docker run 命令解析 docker run 命令用于从给定的镜像启动一个新的容器。这个命令可以包含许多选项,下面是一些常用的选项: -d:后台运行容器,并返回容器ID;-i:以交互模式运行容器,通常与 -t …

【C++】string类 (模拟实现详解 下)

我们接着上一篇【C】string类 (模拟实现详解 上)-CSDN博客继续对string模拟实现。从这篇内容开始,string相关函数的实现就要声明和定义分离了。 1.reserve、push_back和append 在string.h的string类里进行函数的声明。 void reserve(size_…

JVM(HotSpot):GC之垃圾回收器的分类

文章目录 前言一、串行二、吞吐量优先三、响应时间优先四、常见垃圾回收器使用组合 前言 上一篇,我们学习了分代回收机制 它的主要内容是对JVM内存的一个划分,以及垃圾回收器工作时,区域运作顺序的一个规定。 所以,它是一个规范。…

Spring Boot论坛网站:开发、部署与管理

3系统分析 3.1可行性分析 通过对本论坛网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本论坛网站采用SSM框架,JAVA作为开发语言,是…

智慧楼宇平台,构筑未来智慧城市的基石

随着城市化进程的加速,城市面临着前所未有的挑战。人口密度的增加、资源的紧张、环境的恶化以及对高效能源管理的需求,都在推动着我们寻找更加智能、可持续的城市解决方案。智慧楼宇作为智慧城市建设的重要组成部分,正逐渐成为推动城市可持续…

MATLAB电化学特性评估石墨和锂电

🎯要点 模拟对比石墨电池的放电电压曲线与实验数据定性差异。对比双箔、多相多孔电极理论和锂电有限体积模型实现。通过孔隙电极理论模型了解粗粒平均质量和电荷传输以及孔隙率的表征意义。锂电中锂离子正向和逆向反应速率与驱动力的指数以及电解质和电极表面的锂浓…

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…

「Qt Widget中文示例指南」如何实现半透明背景?

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文将为大家展示如…

《Linux从小白到高手》综合应用篇:深入理解Linux常用关键内核参数及其调优

1. 题记 有关Linux关键内核参数的调整,我前面的调优文章其实就有涉及到,只是比较零散,本篇集中深入介绍Linux常用关键内核参数及其调优,Linux调优80%以上都涉及到内核的这些参数的调整。 2. 文件系统相关参数 fs.file-max 参数…

Excel 对数据进行脱敏

身份证号脱敏:LEFT(A2,6)&REPT("*",6)&RIGHT(A2,6) 手机号脱敏:LEFT(B2,3)&REPT("*",5)&RIGHT(B2,3) 姓名脱敏:LEFT(C2,1)&REPT("*",1)&RIGHT(C2,1) 参考: excel匹配替换…

STM32F103C8T6 IO 操作

1.开启相关时钟 在 STM32 微控制器中,开启 GPIO 端口的时钟是确保 IO 口可以正常工作的第一步。 查找 RCC 寄存器使能时钟 在 STM32 中,时钟控制的寄存器通常位于 RCC (Reset and Clock Control) 模块中。不同的 STM32 系列(如 STM32F1、STM…

【单元测试】深入解剖单元测试的思维逻辑

目录 一、前言二、准备环境三、 常用的mock语句3.1 模拟指定类的对象实例,用于模拟依赖对象(类成员)3.2 定义被测试对象3.3 模拟枚举类型/静态方法3.4 模拟依赖方法3.5 模拟构造方法3.6 验证方法调用次数3.7 验证返回值3.8 验证异常对象 四、…

第十六周:机器学习笔记

第十六周周报 摘要Abstratc一、机器学习1. Pointer Network(指针网络)2. 生成式对抗网络(Generative Adversarial Networks | GAN)——(上)2.1 Generator(生成器)2.2 Discriminator&…

ssm企业库存管理微信小程序-计算机毕业设计源码82704

摘 要 本文基于SSM框架,设计与实现了一个企业库存管理微信小程序。该小程序主要包括用户登录、库存查询、入库操作、出库操作等功能模块。在设计过程中,采用了前后端分离的架构,前端使用了微信小程序原生开发工具进行开发,后端使用…

【C++篇】探索STL之美:熟悉使用String类

CSDN 文章目录 前言 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗&…

ApacheShiro反序列化 550 721漏洞

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理个漏洞被称为 Shiro550 是因为在Apache Shiro的GitHub问题跟踪器中,该漏洞最初被标记为第550个问题,721漏洞名称也是由此而来 Shiro-550 CVE-2016-4437 Shiro反序列化Docker复现 …

Android GPU Inspector分析帧数据快速入门

使用 谷歌官方工具Android GPU Inspector (AGI) 可以对Android 应用进行深入和全面的系统性能分析和帧性能分析 。AGI 是一个非常强大的分析工具,尤其是在需要诊断 GPU 性能问题和优化应用时,可以帮助你精准找到性能瓶颈。本文介绍如何使用该工具对帧数据…

HTTP Proxy环境下部署Microsoft Entra Connect和Health Agents

在企业环境中,时常需要通过使用HTTP Proxy访问Internet,在使用HTTP Proxy访问Internet的环境中部署Microsoft Entra Connect和Microsoft Entra Connect Health Agents可能会遇到一些额外的配置步骤,以便这些服务能够正常连接到Internet。 一…