365天深度学习训练营-第J8周:Inception v1算法实战与解析

 目录

一、前言

二、论文解读

1. Inception 模块

2. 网络深度问题

3. 全局平均池化

4. 卷积层的并行结构

5. 1x1 卷积核

6.详细的网络结构

三、代码复现


一、前言

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊|接辅导、项目定制
● 难度:夯实基础⭐⭐
● 语言:Python3、Pytorch3
● 时间:4月1日-4月7日
🍺要求:
1、了解并学习图2中的卷积层运算量的计算过程(🏐储备知识->卷积层运算量的计算,有我的推导过程,建议先自己手动推导,然后再看)
2、📌 了解并学习卷积层的并行结构与1x1卷积核部分内容(重点)
3、尝试根据模型框架图写入相应的pytorch代码,并使用Inception v1完成猴痘病识别

二、论文解读

论文:Going deeper with convolutions

1. Inception 模块

为了加深网络,文章中提出了Inception 结构,它是一个能够有效减少参数数量的结构。在之前的卷积网络中,使用多个卷积核并行处理一张图片,不同卷积核之间的输出结果串联成了当前卷积层的输出。而在Inception 结构中,则是使用了多个不同的卷积核并行处理一张图片。具体来说,Inception 模块由四个分支组成:1x1卷积核,3x3卷积核、5x5卷积核以及3x3最大池化,最后将这些不同的分支进行拼接。其中,1x1卷积核的作用是对通道数进行降维,这样就可以降低模型的参数量。此外,文章还针对Inception中可能存在的梯度消失和梯度爆炸问题,提出了使用BN层进行正则化的方式。

2. 网络深度问题

作者进一步讨论了如何在训练过程中解决网络深度问题。当网络的深度增加时,梯度消失和梯度爆炸问题也随之变得越来越严重,导致网络难以收敛。作者提出的方法是使用一个残差学习的结构来训练网络。Residual Block 将输入值与该层中间结果最后的输出相加,这样网络就可以保证每一层的输出都建立在前面层输出的基础上,避免梯度消失和爆炸问题。

3. 全局平均池化

此外,作者还提出了一个新的替代方案—— Global Average Pooling。在传统的卷积神经网络中,常常会通过全连接层将卷积层的输出转化为特征,再交给softmax分类。在过去,我们称这些特征为向量,其他领域则将其称之为“词嵌入”(word embedding)。然而,作者认为将这个过程替换为全局平均池化的过程就可以达到同样的效果,做到参数数量的大幅度减少,同时能够保留较好的特征。

4. 卷积层的并行结构

卷积操作是计算非常耗时的操作,大量的运算需要消耗大量的时间和计算资源。在卷积层的并行结构中,我们使用多组卷积核来同时处理一组待处理数据,以此来提高计算速度。

在深度卷积网络中,一个卷积层通常使用多组卷积核来对输入数据进行处理,不同的卷积核会提取图片中不同尺寸和不同颜色空间的特征。这样在一个卷积层中我们就可以使用多组卷积核并行处理同一张图片生成多个特征图,每个卷积核专门处理输入数据的不同方面,最终再将每个卷积核生成的特征图进行并集,组合成一个更全面的特征图,这样实现了卷积层并行处理。

5. 1x1 卷积核

1x1 卷积核是卷积层的核心,在网络中被广泛使用,通常起到降维打击的作用。它一般用来在网络中调整特征图的深度,即指定输出特征含有多少个属性。以1x1的卷积核取代原来的全连接层,可以大大减少网络的参数量和计算量。

在文章中,作者提出了一个经典的例子:假设有一个 28x28x192 的特征图,如果需要将其连接到一个 2048 个神经元的全连接层中,那么 GAP(全局平均池化)的做法就是使用一个 1x1x2048 的卷积核,而使用全连接层的做法就是需要的参数量为 28x28x192x2048 = 52.43M,而使用 1x1 卷积核的做法需要的参数量为 192x2048 = 393.216K,前者参数的数量相对后者大出100倍级别,这就是 1x1 卷积核的优秀性能所在。

当然,1x1 卷积核的作用不仅仅是降维,同时还可以通过调整通道数进行增加宽度,增强特征图的多样性和丰富性。

6.详细的网络结构

三、代码复现

pytorch

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

# 定义Inception Block中的各种卷积层
# (这里的k参数代表了Inception Block中的不同卷积层的卷积核大小)
def conv_block(in_channels, out_channels, k, stride=1, padding=0):
    layers = []
    # 首先进行1x1卷积核的卷积
    layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=1))
    # 对1x1卷积核的输出再进行kxk卷积核的卷积
    layers.append(nn.Conv2d(out_channels, out_channels, kernel_size=k, stride=stride, padding=padding))
    # 对两次卷积操作的结果进行Batch Normalization处理
    layers.append(nn.BatchNorm2d(out_channels))
    # 使用ReLU激活函数对输出进行非线性化变换
    layers.append(nn.ReLU())
    return nn.Sequential(*layers)

# 定义Inception Block
class InceptionBlock(nn.Module):
    def __init__(self, in_channels, ch1x1, ch3x3red, ch3x3, ch5x5red, ch5x5, pool_proj):
        super(InceptionBlock, self).__init__()
        # 第一支路径:1x1卷积核 -> 3x3卷积核
        self.branch1 = conv_block(in_channels, ch3x3red, k=1)
        self.branch2 = nn.Sequential(
            # 第二支路径:1x1卷积核 -> 5x5卷积核 
            conv_block(in_channels, ch5x5red, k=1),
            conv_block(ch5x5red, ch5x5, k=5, padding=2)
        )
        self.branch3 = nn.Sequential(
            # 第三支路径:1x1卷积核 -> 1x7卷积核 -> 7x1卷积核 -> 3x3卷积核
            conv_block(in_channels, ch1x1, k=1),
            conv_block(ch1x1, ch3x3, k=3, padding=1)
        )
        self.branch4 = nn.Sequential(
            # 第四支路径:3x3最大化池化 -> 1x1卷积核
            nn.MaxPool2d(kernel_size=3, stride=1, padding=1),
            conv_block(in_channels, pool_proj, k=1)
        )
        
    def forward(self, x):
        # 将输入在四个分支中进行处理
        branch1 = self.branch1(x)
        branch2 = self.branch2(x)
        branch3 = self.branch3(x)
        branch4 = self.branch4(x)
        # 将所有分支输出在Channel维度上拼接起来
        outputs = [branch1, branch2, branch3, branch4]
        return torch.cat(outputs, 1)

# 定义整个Inception v1网络架构
class InceptionV1(nn.Module):
    def __init__(self, num_classes=1000):
        super(InceptionV1, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3)
        self.maxpool1 = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        self.conv2 = nn.Conv2d(64, 192, kernel_size=3, stride=1, padding=1)
        self.maxpool2 = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        # 共设5个Inception Block
        self.inception3a = InceptionBlock(192, 64, 96, 128, 16, 32, 32)
        self.inception3b = InceptionBlock(256, 128, 128, 192, 32, 96, 64)
        self.inception4a = InceptionBlock(480, 192, 96, 208, 16, 48, 64)
        self.inception4b = InceptionBlock(512, 160, 112, 224, 24, 64, 64)
        self.inception4c = InceptionBlock(512, 128, 128, 256, 24, 64, 64)
        self.inception4d = InceptionBlock(512, 112, 144, 288, 32, 64, 64)
        self.inception4e = InceptionBlock(528, 256, 160, 320, 32, 128, 128)
        self.inception5a = InceptionBlock(832, 256, 160, 320, 32, 128, 128)
        self.inception5b = InceptionBlock(832, 384, 192, 384, 48, 128, 128)
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.dropout = nn.Dropout(p=0.4)
        self.fc = nn.Linear(1024, num_classes)
        
    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = self.maxpool1(x)
        x = F.relu(self.conv2(x))
        x = self.maxpool2(x)
        x = self.inception3a(x)
        x = self.inception3b(x)
        x = self.inception4a(x)
        x = self.inception4b(x)
        x = self.inception4c(x)
        x = self.inception4d(x)
        x = self.inception4e(x)
        x = self.inception5a(x)
        x = self.inception5b(x)
        x = self.avgpool(x)
        x = x.view(x.size(0), -1)
        x = self.dropout(x)
        x = self.fc(x)
        return x

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务+springcloud+springcloud alibaba学习笔记【Eureka服务注册中心】(3/9)

Eureka服务注册中心 3/91、服务注册与发现1.1 什么是服务治理:1.2 什么是服务注册与发现:1.3 Eureka服务注册与发现2、单机版eureka2.1 创建module2.2改pom依赖2.3写yml配置文件:2.4主启动类2.5 修改服务提供者 cloud-provider-payment8001 模块&#xf…

Github库中的Languages显示与修改

目录 前言 【.gitattributes】文件 修改GitHub语言 前言 上传一个项目到GitHub时,发现显示的语言并非是自己项目所示的语言,这样的情况是经常发生的,为了能到达自己所需快速检索,或者是外部访问者能很好的搜索我们的项目&#…

Sentinel滑动时间窗限流算法原理及源码解析(中)

文章目录 MetricBucketMetricEvent数据统计的维度WindowWrap样本窗口实例 范型T为MetricBucket windowLengthInMs 样本窗口长度 windowStart 样本窗口的起始时间戳 value 当前样本窗口的统计数据 其类型为MetricBucket MetricBucket MetricEvent数据统计的维度 1、首先计算27t位…

【花雕学AI】09:发挥ChatGPT最大潜力——产生高质量内容的九种方法和建议

人工智能(AI)是当今科技领域最热门和最有前景的话题之一,它已经渗透到了我们生活和工作的方方面面,给我们带来了许多便利和惊喜。而在AI的众多分支中,自然语言处理(NLP)是最贴近人类的一个领域&…

6-python异常、错误、模块、包

文章目录1.异常2.错误3.模块4.包[综合练习]1.异常 打开一个不存在的文件会引发异常 FileNotFoundError: [Errno 2] No such file or directory: ‘D:/不存在的文件.txt’ fopen(file"D:/不存在的文件.txt",mode"r", encodingutf-8) print(f.read())&…

springboot-gateway注册nacos失败,控制台没有报错

目录 前言现象描述前言 最近springboot的gateway注册到nacos上,没有注册成功 现象描述 我是在common里面引入了nacos的依赖,依赖如下: <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-confi…

文件的随机读写

fseek fseek这个函数的作用是什么&#xff1f; 我们知道&#xff0c;如果对一个文件指针进行加减操作的话&#xff0c;这个文件指针会指向下一个文件&#xff0c;那么问题来了&#xff0c;我们如果想访问这个文件中的某一个内容&#xff0c;这个时候该怎么办呢&#xff0c;我们…

基于支持向量机SVM的脑部肿瘤识别,脑电波样本熵提取

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于SVM的的脑部肿瘤识别分类预测 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它…

下一代的新操作系统就是ChatGPT!

什么是CHatgpt&#xff1f; ChatGPT是人工智能研究实验室OpenAI在2022年11月30日推出的聊天机器人模型&#xff0c;它使用Transformer神经网络架构&#xff0c;训练数据来自包括维基百科&#xff0c;以及真实对话在内的庞大语料库。2023年1月30日消息称&#xff0c;中国搜索巨…

数据分析-统计基础

day1&#xff1a;集中趋势&#xff0c;离散测度&#xff0c;均值&#xff0c;中位数&#xff0c;众数&#xff0c;方差等。点估计&#xff0c;区间估计等相关的知识 现代数据分析&#xff1a;把数据放到一个数据空间中&#xff0c;通过这个空间的个各种形变与分析而挖掘除数据…

Android RenderScript 浅谈

前言 RenderScript是一个Google出品的&#xff0c;在Android平台上的并行计算框架&#xff0c;官方的简介是说RenderScript运行时可在设备上提供的多个处理器&#xff08;如多核 CPU 和 GPU&#xff09;间并行调度工作。在日常Android开发中&#xff0c;RenderScript主要用于图…

数据库:Redis哨兵及cluster集群部署

一、redis数据库哨兵模式 目录 一、redis数据库哨兵模式 1、什么是哨兵模式 2、哨兵的作用 3、哨兵结构组成 4、哨兵故障转移机制 5、哨兵工作、切换原理 6、哨兵主节点选举原则 7、哨兵模式部署 二、redis数据库cluster集群 1、cluster集群优点、数据存储及同步方式…

Chapter2 : SpringBoot配置

尚硅谷SpringBoot顶尖教程 1. 全局配置文件 SpringBoot使用一个全局的配置文件 application.properties 或者 application.yml &#xff0c;该配置文件放在src/main/resources目录或者类路径/config目录下面&#xff0c; 可以用来修改SpringBoot自动配置的默认值。 yml是YA…

wxml模板,wxss模版,全局配置,页面配置,网络数据请求

WXML 模板语法 1、数据绑定 1.1、数据绑定的基本原则 ① 在 data 中定义数据② 在 WXML 中使用数据 1.2、在 data 中定义页面的数据 在页面对应的 .js 文件中&#xff0c;把数据定义到 data 对象中即可&#xff1a; Page({data: {//字符串数据info:init data}, });1.3、M…

《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》

一、架构图 如下图所示&#xff1a; 二、环境信息 主机名K8S版本系统版本内核版本IP地址备注k8s-master-621.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.62master节点k8s-worker-631.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63worker节点k8s-worker-641…

二、SDN-计算机网络专项(2)

1、编码 编码形式&#xff1a; 以太网使用的编码方式为曼彻斯特编码。 2、信息传输速率 &#xff08;1&#xff09;香农定理 带宽为W&#xff08;Hz&#xff09;且有高斯噪音干扰&#xff08;信噪比S/N&#xff09;的信道极限信息传输速率为&#xff1a; 还有&#xff0c;信噪…

Linux_红帽8学习笔记分享_2

Linux_红帽8学习笔记分享_2 文章目录Linux_红帽8学习笔记分享_21.远程控制servera和serverb1.1开启多标签页1.2启用servera和serverb1.3连接servera和serverb2.退出子虚拟机并关机2.1退出子虚拟机2.2关闭虚拟机2.3重启虚拟机3.Linux在使用过程中遇到的基础操作3.1退出至登录界面…

Spring销毁的几种实现

有这3种方法&#xff0c;但是程序执行完成并没有打印出来。一定要手动close.手动执行后会调用如下逻辑&#xff1a;org.springframework.context.support.AbstractApplicationContext#doCloseorg.springframework.context.support.AbstractApplicationContext#destroyBeansorg.…

点亮孙武不夜城 拉响惠民经济新引擎

凡战者&#xff0c;以奇制胜。这次的招商很特别—孙武不夜城招商项目正式启动&#xff01;      无租金、无投资、无风险合伙人制。      现诚邀广大商家合作&#xff0c;相聚不夜城。同此道者&#xff0c;合大志&#xff0c;鸣鼓纳征&#xff0c;亮惠民夜生活&#xf…

一位年薪35W的测试被开除,回怼的一番话,令人沉思

一位年薪35W测试工程师被开除回怼道&#xff1a;“反正我有技术&#xff0c;在哪不一样” 一技傍身&#xff0c;万事不愁&#xff0c;当我们掌握了一技之长后&#xff0c;在职场上说话就硬气了许多&#xff0c;不用担心被炒&#xff0c;反过来还可以炒了老板&#xff0c;这一点…