探索未来的视觉革命:卷积神经网络的崭新时代(二)

news2024/12/28 19:33:54

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢迎在文章下方留下你的评论和反馈。我期待着与你分享知识、互相学习和建立一个积极的社区。谢谢你的光临,让我们一起踏上这个知识之旅!
请添加图片描述

文章目录

  • 🍋引言
  • 🍋GoogleNet的架构
  • 🍋1×1 convolution
  • 🍋如何有效避免梯度消失?
  • 🍋总结

本节在学完刘二大人的卷积神经网络进阶篇,令我感受颇深,下面我先说一下知识点,文章的结尾我再表达一下我的个人看法以及刘二大人对我们的建议。

🍋引言

本节介绍一下GoogleNet,首先说一下它的背景历史,GoogleNet是由Google研究员Christian Szegedy等人于2014年提出的深度卷积神经网络架构。它在当时的ImageNet图像分类挑战赛中取得了惊人的成绩,将错误率大幅度降低,标志着深度学习领域的一次巨大突破。

🍋GoogleNet的架构

在这里插入图片描述

GoogleNet之所以引人注目,是因为它采用了一种全新的架构,即Inception架构。这个架构采用了多尺度卷积核,允许网络同时学习不同尺度的特征。这里解释一下就是类似于多条路一起跑,看看哪个好Inception模块将不同大小的卷积核组合在一起,从而有效捕获图像中的各种特征,无论是边缘、纹理还是高级抽象的特征。

GoogleNet的架构包括多个Inception模块,这些模块由卷积层、池化层、全连接层和辅助分类器组成。此外,GoogleNet采用了1x1卷积核来减少模型的参数数量,从而减小了计算复杂度。上图的图例可以看到一些简单的标识,以及在网络中的分布
刘二二人这里提到了一点,观察网络的共同点,发现有一部分出现的频率很大,如下图红框中所示
在这里插入图片描述

🍋1×1 convolution

这解释1×1的卷积前,我们先来看看Inception模型图示,不难发现,每条路都有一个共同的点那就是都经过了1×1的卷积。
在这里插入图片描述

那么1×1的卷积究竟有什么魔力呢?我们先从下方的图示了解一下运算
在这里插入图片描述
其实就是每个相乘再相加,接下来我们通过一组数据进行对比一下,1×1卷积的作用
在这里插入图片描述

同样都是从192 Channel到32 Channel,前者使用了一个5×5的卷积,后者在5×5的卷积前加了一个1×1的卷积,运算值居然是原来的十分之一,那么从这里我们就清楚了它的主要功能。

  • 通道降维(channel dimension reduction):通过应用 1×1 卷积,可以减小特征图的通道数量,从而降低模型的计算负担。这对于减小模型的参数数量和计算复杂度很有帮助。通道降维有时也称为特征压缩。

  • 通道混合(channel mixing):1×1 卷积可以将不同通道之间的信息进行混合。它通过学习权重来组合输入通道的信息,以产生更丰富的特征表示。这有助于模型更好地捕获特征之间的关联。

  • 非线性变换:虽然 1×1 卷积核的大小为 1x1,但通常会包括非线性激活函数,如ReLU(Rectified Linear Unit)。这使得 1×1 卷积可以执行非线性变换,有助于模型更好地捕获复杂的模式。


如果使用代码进行每条路的编写可以参考下图
在这里插入图片描述
最后一个老师说空间不足,这里需要补充一句

branch3×3 = self.branch3×3_3(branch3×3)

之后需要将它们使用cat拼接起来
在这里插入图片描述

outputs = [branch1x1, branch5x5, branch3x3, branch_pool] 
return torch.cat(outputs, dim=1)

这里说明一下拼接的作用,Inception模块中的拼接操作的主要作用是将不同尺度和类型的特征融合在一起,以丰富特征表示并提高网络性能。这是GoogleNet取得成功的一个关键因素,使其在图像分类等任务中表现出色。


完整的代码如下:

class InceptionA(nn.Module):
	def __init__(self, in_channels):
		super(InceptionA, self).__init__()
		self.branch1x1 = nn.Conv2d(in_channels, 16, kernel_size=1)
		self.branch5x5_1 = nn.Conv2d(in_channels,16, kernel_size=1) 
		self.branch5x5_2 = nn.Conv2d(16, 24, kernel_size=5, padding=2)
		self.branch3x3_1 = nn.Conv2d(in_channels, 16, kernel_size=1) 
		self.branch3x3_2 = nn.Conv2d(16, 24, kernel_size=3, padding=1) 
		self.branch3x3_3 = nn.Conv2d(24, 24, kernel_size=3, padding=1)
		self.branch_pool = nn.Conv2d(in_channels, 24, kernel_size=1)
	def forward(self, x):
		branch1x1 = self.branch1x1(x)
		branch5x5 = self.branch5x5_1(x)
		branch5x5 = self.branch5x5_2(branch5x5)
		branch3x3 = self.branch3x3_1(x)
		branch3x3 = self.branch3x3_2(branch3x3) 
		branch3x3 = self.branch3x3_3(branch3x3)
		branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1) 
		branch_pool = self.branch_pool(branch_pool)
		outputs = [branch1x1, branch5x5, branch3x3, branch_pool] 
		return torch.cat(outputs, dim=1)

之后我们需要定义网络层

class Net(nn.Module):
	def __init__(self):
		super(Net, self).__init__()
		self.conv1 = nn.Conv2d(1, 10, kernel_size=5) 
		self.conv2 = nn.Conv2d(88, 20, kernel_size=5)
		self.incep1 = InceptionA(in_channels=10) 
		self.incep2 = InceptionA(in_channels=20)
		self.mp = nn.MaxPool2d(2)
		self.fc = nn.Linear(1408, 10)
	def forward(self, x):
		in_size = x.size(0)
		x = F.relu(self.mp(self.conv1(x))) 
		x = self.incep1(x)
		x = F.relu(self.mp(self.conv2(x))) 
		x = self.incep2(x)
		x = x.view(in_size, -1)
		x = self.fc(x)
		return x

🍋如何有效避免梯度消失?

在这里插入图片描述
这里我们引入Residual net
在这里插入图片描述

完整的结构与代码如下
在这里插入图片描述

🍋总结

GoogleNet是深度学习领域的一项重要成就,它的Inception架构为图像分类和计算机视觉任务提供了高效的解决方案。在Python中,我们可以轻松使用深度学习框架来构建和应用GoogleNet模型。同时文本还介绍了一种避免梯度消失的方法。


视频结尾老师讲述了一些学习方法,主要有四点如下

  • 理论《深度学习》
  • 阅读pytorch文档(通读一遍)
  • 复现经典论文(代码下载,读代码,写代码)
  • 扩充视野

本文根据b站刘二大人《PyTorch深度学习实践》完结合集学习后加以整理,文中图文均不属于个人。

请添加图片描述

挑战与创造都是很痛苦的,但是很充实。

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

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

相关文章

自主武器系统对伦理和法律的挑战

【第十届北京香山论坛是中国军事科学学会、中国国际战略学会联合主办的论坛,将于2023年10月29日至31日在北京举行。本次论坛的主题是“共同安全、持久和平”,聚焦全球安全倡议重点合作方向,为各方共议安全难题、求解安全之策、促进安全合作提…

Leetcode1971. 寻找图中是否存在路径

Every day a Leetcode 题目来源:1971. 寻找图中是否存在路径 解法1:并查集 并查集介绍:并查集详解 代码: /** lc appleetcode.cn id1971 langcpp** [1971] 寻找图中是否存在路径*/// lc codestart class UnionFind {vector&…

Node-RED系列教程-27node-red操作邮件节点

提前注册好一个163邮箱: 安装以下节点: 演示发送邮件的功能

ESXI6.5安装教程

设置从IPMI Virtual Disk 3000启动,出现如下界面: 默认选择第一项,回车安装 安装程序正在检测服务器硬件信息,如果不满足系统安装条件会跳出错误提示。 检测完成之后会出现下面界面 回车 按F11 这里列出了服务器硬盘信息&#…

【算法|动态规划No.29】leetcode132. 分割回文串 II

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

022-第三代软件开发-QCustomPlot核心迁移

第三代软件开发-QCustomPlot核心迁移 文章目录 第三代软件开发-QCustomPlot核心迁移项目介绍先说点GitHub CopilotQCustomPlot核心迁移QQuickPaintedItemXXX_QCustomChart 关键字: Qt、 Qml、 QCustomPlot、 GitHub Copilo、 关键字5 项目介绍 欢迎来到我们的 …

Leetcode—2331.计算布尔二叉树的值【简单】

2023每日刷题(六) Leetcode—2331.计算布尔二叉树的值 递归实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool evaluateTree(struct TreeNod…

计算机网络_网络层概述

4.1 网络层概述 4.1.1 一.分组转发和路由选择 网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机,可以将该任务划分为分组转发和路由选择两种重要的功能。 注释:A发送到B,从1端口进入. 如何得知是从2还是从3中转发出去呢?--------->这…

M4内核启动全过程(从零写代码,不用任何库,深入分析启动过程和函数调用规则)

引言 玩过stm32的小伙伴,应该知道,在使用的keil工程里面有一个start.s的启动文件(网上关于这个启动文件的分析很多,本文不是讲解启动文件的文字,不打算具体讲解这个文件的内容)。start.s文件是芯片复位、启…

微信小程序-微信授权登录

前言 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系 一.微信授权登录工作流程 1.理论叙述 触发授权登录: 用户在小程序中触发登录操作,通常通过点击登录按钮或执行相关操作。 授权弹窗: 小程序弹…

python树结构包treelib入门及其计算应用

树是计算机科学中重要的数据结构。例如决策树等机器学习算法设计、文件系统索引等。创建treelib包是为了在Python中提供树数据结构的有效实现。 Treelib的主要特点包括: 节点搜索的高效操作。支持常见的树操作,如遍历、插入、删除、节点移动、浅/深复制…

【Ascend C算子开发(入门)】——Ascend C编程模式与范式

Ascend C编程模型与范式 1.并行计算架构抽象 Ascend C编程开发的算子是运行在AI Core上的,所以我们需要了解一下AI Core的结构。AI Core主要包括计算单元、存储单元、搬运单元。 计算单元包括了三种计算资源:Scalar计算单元(执行标量计算&…

登上抖音同城热搜榜:如何让你的短视频成为焦点?

登上抖音同城热搜榜的首要前提是紧跟潮流,捕捉热点。热点通常具有时效性、话题性和关注度,能够迅速吸引人们的注意力。要想捕捉热点,你需要关注新闻、社交媒体和抖音热门话题,时刻关注大众关心的问题。例如,近期热门的…

rabbitMQ(3)

RabbitMq 交换机 文章目录 1. 交换机的介绍2. 交换机的类型3. 临时队列4. 绑定 (bindings)5. 扇形交换机(Fanout ) 演示6. 直接交换机 Direct exchange6.1 多重绑定6.2 direct 代码案例 7. 主题交换机7.1 Topic 匹配案例7.2 Topic 代码案例 8. headers 头…

【力扣每日一题】2023.10.22 做菜顺序

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 给我们一个数组表示每个菜的满意度,我们可以指定做哪些菜以及做的顺序,需要我们凑到一个系数的最大值&#xff0c…

第三章 内存管理 十五、内存映射文件

目录 一、传统的文件访问方式 二、内存映射文件 1、方便文件的访问 2、实现文件数据的共享 三、总结 一、传统的文件访问方式 二、内存映射文件 1、方便文件的访问 2、实现文件数据的共享 三、总结

教你注册chrome开发者账号,并发布chrome浏览器插件。

本篇文章主要讲解,注册chrome开发者账号,及发布chrome浏览器插件的流程。包含插件的打包和上传。 日期:2023年10月22日 作者:任聪聪 一、前提准备:注册chrome开发者账号 说明:注册需要5美元,一…

Qt界面容器:Widget、 Frame、分组框、滚动区、工具箱、选项卡小部件、堆叠小部件控件精讲

​Qt 界面设计容器简介 Qt中常用的容器控件, 包括: Widget, Frame, Group Box, Scroll Area, Tool Box, Tab Widget, Stacked Widget。 QWidget 这个类是所有窗口类的父类, 可以作为独立窗口使用, 也可以内嵌到其它窗口中使用。 头文件: #include <QWidget> qmake: QT…

按键控制LED灯亮灭

按键原理图&#xff1a;按键选用PE4 创建两个文件一个.c文件一个.h文件来写按键的代码 .c文件 #include "Key.h"void Key_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode GPIO_M…

python astra相机驱动问题

报错问题&#xff1a; openni.utils.OpenNIError: (OniStatus.ONI_STATUS_ERROR, bDeviceOpen using default: no devices found, None) 解决办法&#xff1a; 1、从sdk中拷贝文件 2、修改openni源码 3、执行测试程序 from openni import openni2 import numpy as np impor…