GoogLeNet(V1)

news2024/11/25 5:56:46

目录

一、GooLeNet介绍

1、模型设计的motivation

2、Inception块

3、GoogLeNet架构

4、Inception后续变种

5、总结

二、代码实现

1、Inception块

2、GoogLeNet模型

3、训练模型

4、总结


一、GooLeNet介绍

       GoogLeNet是由Google团队于2014年提出的深度卷积神经网络架构,也被称为Inception v1。它在当时引入了一些创新的设计理念,成为了深度学习领域的里程碑之一。GoogLeNet的设计目标是在保持网络深度的同时,减少参数数量,提高计算效率。

       虽然NiN目前没有大规模使用,但是GoogLeNet目前还在大规模使用,它也是第一个超过100层的神经网络,它名字中的“L”大写是为了致敬LeNet。NiN的思想严重影响了GoogLeNet的设计。

1、模型设计的motivation

       之前我们可能存在一些疑问:卷积核要选多大?通道数要选多大?池化层应该使用最大池化还是平均池化?选择很多但是不知道用哪个比较好。

2、Inception块

       GoogLeNet引入了"Inception"模块,该模块通过并行使用多个不同大小的卷积核和池化操作,来提取不同尺度的特征。这种并行操作帮助网络同时捕捉到局部和全局的特征,从而提高了网络的表达能力。此外,为了减少参数数量,GoogLeNet还使用了1x1的卷积核进行降维和升维操作,以减少计算成本。

       其实是将输入Input给copy了4份,通过4条不同的路径对图像进行特征提取(加入必要的padding保证输出跟输入等高等宽),最后将输出的4个特征图在通道维度进行concat(拼接)操作。根据上图可以知道Inception不改变输入的高和宽,只改变通道数。

在GoogLeNet中,基本的卷积块被称为Inception块(Inception block)。这很可能得名于电影《盗梦空间》(英文名:Inception),因为电影中的一句话“我们需要走得更深”(“We need to go deeper”)。

       跟单 $3 \times 3$ 或 $5 \times 5$ 卷积层比,Inception块有更少的参数个数和计算复杂度。

Parameters(参数量)FLOPS(计算量)
Inception0.16 M128 M
3×3 Conv0.44 M346 M
5×5 Conv1.22 M963 M

3、GoogLeNet架构

       在网络结构方面,GoogLeNet采用了多个Inception模块的堆叠。每个Inception模块由多个并行的卷积层和池化层组成,它们的输出被拼接在一起形成下一层的输入。通过堆叠多个Inception模块,网络可以逐渐提取更加抽象和高级的特征。GoogLeNet主要分成了5个Stage,所谓的Stage一般这么算:图像的高宽减半是一个Stage。

(1)Stage1 and Stage2

       Stage1和Stage2没有使用Inception Block。

  • channel变化:3 -> 64 -> 192
  • (h, w)变化:3次strides=2,每次图片尺寸减半,因此图片大小缩小8倍:$ 224\div 8=28 $

(2)Stage3

       Stage3使用了2个Inception Block。

  • channel变化:192 -> 256 ->480
  • (h, w)变化:Inception Block不改变图片尺寸。在两个Inception Block后面有一个MaxPool,其stride=2,因此图片大小缩小2倍 $ 28 \div 2=14 $

(3)Stage4 and Stage5

       Stage4和Stage5使用了7个Inception Block。这里最后和NiNNet不一样:NiNNet经过最后一个NiN块时输出通道个数直接等于类别数,后面不需要全连接层;而GoogLeNet经过最后一个Inception块后通道数很多,在后面加一个全连接层(FC),使通道个数经过全连接层后等于类别数。

  • channel变化:480 -> 512 -> 832 -> 1024
  • (h, w)变化:Inception Block不改变图片尺寸。Stage4后面有一个MaxPool,其stride=2,此时(h, w)会从14变为7,在Stage5后面有一个全局平均池化(GlobalAvgPool),此时会(h, w)会直接变成1。

4、Inception后续变种

  • Inception-BN (V2): 使用了batch normalization。
  • Inception-V3: 修改了Inception块:替换 $5 \times 5$ 为多个 $3 \times 3$ 卷积层、替换 $5 \times 5$ 为 $1 \times 7$ 和 $7 \times 1$ 卷积层、替换 $3 \times 3$ 为 $1 \times 3$ 和 $3 \times 1$ 卷积层、更深。
  • Inception-V4: 使用残差连接。

5、总结

二、代码实现

1、Inception块

       如下图所示,Inception块由四条并行路径组成。前三条路径使用窗口大小为 $1\times 1$$3\times 3$ 和 $5\times 5$ 的卷积层,从不同空间大小中提取信息。中间的两条路径在输入上执行 $1\times 1$ 卷积,以减少通道数,从而降低模型的复杂性。第四条路径使用 $3\times 3$ 最大池化层,然后使用 $1\times 1$ 卷积层来改变通道数。

       这四条路径都使用合适的填充来使输入与输出的高和宽一致,最后我们将每条线路的输出在通道维度上连结,并构成Inception块的输出。在Inception块中,通常调整的超参数是每层输出通道数。

import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l

class Inception(nn.Module):
    # c1--c4是每条路径的输出通道数
    def __init__(self, in_channels, c1, c2, c3, c4, **kwargs):
        super(Inception, self).__init__(**kwargs)
        # 线路1,单1x1卷积层
        self.p1_1 = nn.Conv2d(in_channels, c1, kernel_size=1)
        # 线路2,1x1卷积层后接3x3卷积层
        self.p2_1 = nn.Conv2d(in_channels, c2[0], kernel_size=1)
        self.p2_2 = nn.Conv2d(c2[0], c2[1], kernel_size=3, padding=1)
        # 线路3,1x1卷积层后接5x5卷积层
        self.p3_1 = nn.Conv2d(in_channels, c3[0], kernel_size=1)
        self.p3_2 = nn.Conv2d(c3[0], c3[1], kernel_size=5, padding=2)
        # 线路4,3x3最大汇聚层后接1x1卷积层
        self.p4_1 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
        self.p4_2 = nn.Conv2d(in_channels, c4, kernel_size=1)

    def forward(self, x):
        p1 = F.relu(self.p1_1(x))
        p2 = F.relu(self.p2_2(F.relu(self.p2_1(x))))
        p3 = F.relu(self.p3_2(F.relu(self.p3_1(x))))
        p4 = F.relu(self.p4_2(self.p4_1(x)))
        # 在通道维度上连结输出
        return torch.cat((p1, p2, p3, p4), dim=1)   # 通道维度dimension为1  (batch, channel, height, width) -> (0, 1, 2, 3)

2、GoogLeNet模型

(1)Stage1

       现在,我们逐一实现GoogLeNet的每个Stage。Stage1使用64个通道、$7\times 7$ 卷积层。

b1 = nn.Sequential(nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),
                   nn.ReLU(),
                   nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

(2)Stage2

       Stage2使用两个卷积层:第一个卷积层是64个通道、$1\times 1$ 卷积层;第二个卷积层使用将通道数量增加三倍的 $3\times 3$ 卷积层。这对应于Inception块中的第二条路径。

b2 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1),
                   nn.ReLU(),
                   nn.Conv2d(64, 192, kernel_size=3, padding=1),
                   nn.ReLU(),
                   nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

(3)Stage3

       Stage3串联两个的Inception块。

b3 = nn.Sequential(Inception(192, 64, (96, 128), (16, 32), 32),
                   Inception(256, 128, (128, 192), (32, 96), 64),
                   nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

(4)Stage4

       Stage4串联了五个Inception块。

b4 = nn.Sequential(Inception(480, 192, (96, 208), (16, 48), 64),
                   Inception(512, 160, (112, 224), (24, 64), 64),
                   Inception(512, 128, (128, 256), (24, 64), 64),
                   Inception(512, 112, (144, 288), (32, 64), 64),
                   Inception(528, 256, (160, 320), (32, 128), 128),
                   nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

(5)Stage5

       Stage5串联了两个Inception块。需要注意的是,Stage5的后面紧跟输出层,该模块同NiN一样使用全局平均池化层,将每个通道的高和宽变成1。最后我们将输出变成二维数组,再接上一个输出个数为标签类别数的全连接层。

b5 = nn.Sequential(Inception(832, 256, (160, 320), (32, 128), 128),
                   Inception(832, 384, (192, 384), (48, 128), 128),
                   nn.AdaptiveAvgPool2d((1, 1)),    # 全局平均池化层
                   nn.Flatten())                    # 将channel+height+width三个维度展平

net = nn.Sequential(b1, b2, b3, b4, b5, nn.Linear(1024, 10))

       GoogLeNet模型的计算复杂,而且不如VGG那样便于修改通道数。为了使Fashion-MNIST上的训练短小精悍,我们将输入的高和宽从224降到96,这简化了计算。下面演示各个模块输出的形状变化。

X = torch.rand(size=(1, 1, 96, 96))
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__,'output shape:\t', X.shape)
Sequential output shape:	 torch.Size([1, 64, 24, 24])
Sequential output shape:	 torch.Size([1, 192, 12, 12])
Sequential output shape:	 torch.Size([1, 480, 6, 6])
Sequential output shape:	 torch.Size([1, 832, 3, 3])
Sequential output shape:	 torch.Size([1, 1024])
Linear output shape:	 torch.Size([1, 10])

3、训练模型

       我们使用Fashion-MNIST数据集来训练我们的模型。在训练之前,我们将图片转换为 $96 \times 96$ 分辨率。

lr, num_epochs, batch_size = 0.1, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
loss 0.262, train acc 0.900, test acc 0.886
3265.5 examples/sec on cuda:0

4、总结

  • Inception块相当于一个有4条路径的子网络。它通过不同窗口形状的卷积层和最大池化层来并行抽取信息,并使用 $1×1$ 卷积层减少每像素级别上的通道维数从而降低模型复杂度。
  • GoogLeNet将多个设计精细的Inception块与其他层(卷积层、全连接层)串联起来。其中Inception块的通道数分配之比是在ImageNet数据集上通过大量的实验得来的。
  • GoogLeNet和它的后继者们一度是ImageNet上最有效的模型之一:它以较低的计算复杂度提供了类似的测试精度。

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

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

相关文章

c++缺省参数与函数重载(超详细)

文章目录 前言一、缺省参数1.缺省参数的概念与使用2.缺省参数的分类3.缺省参数注意事项 二、函数重载1.什莫事函数重载2.函数重载的几种形式3.函数重载与缺省值的结合4.为什么c支持函数重载?? 总结 前言 在本文章中,我们将要详细介绍一下Cc缺…

【MySQL】数据库之索引的增删改查

目录 一、索引是什么 二、索引的作用 三、工作方式 四、创建索引的依据: 五、索引的分类 六、索引的增删改查(索引是一种对象,与字段类似是命令) 索引的添加 ​编辑第一种:普通索引的创建 第二种:唯…

C++ 比 C语言增加的新特性 2

1.C新增了带默认值参数的函数 1.1 格式 格式:返回值 函数名(参数1初始值1,..........){} 例如:void function(int a10){} 调用:不需要更改参数的值:function&#x…

001 图书增删改查 SSM MySQL

技术框架:Spring SpringMVC Mybatis JSP MySQL 001 图书增删改查 SSM MySQL package com.demo.controller;import com.demo.pojo.Book; import com.demo.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.spri…

leetcode 面试题 17.19. 消失的两个数字 (hard)(优质解法)

链接&#xff1a;面试题 17.19. 消失的两个数字 代码&#xff1a; class Solution {public int[] missingTwo(int[] nums) {int lengthnums.length;int tmp0;//将完整数据以及 nums 中的数据都进行异或&#xff0c;得到的就是缺失的两个数字 a^b 的结果for(int i1;i<length…

【飞翔的鸟】飞行游戏-uniapp项目开发流程详解

小时候玩过的飞行游戏&#xff0c;叫什么名字来着&#xff0c;通过点击操作控制煽动翅膀来持续飞行&#xff0c;躲避障碍物&#xff0c;有多远就飞多远吧&#xff0c;现在想起来&#xff0c;其中的实现原理非常简单&#xff0c;感兴趣的话来一起看看&#xff0c;这里给大家讲一…

RIS 系列 Mask Grounding for Referring Image Segmentation 论文阅读笔记

RIS 系列 Mask Grounding for Referring Image Segmentation 论文阅读笔记 一、Abstract二、引言三、相关工作Architecture Design for RISLoss Design for RISMasked Language Modeling 四、方法4.1 结构4.2 Mask Grounding讨论 4.3 跨模态对齐模块4.4 跨模态对齐损失4.5 损失…

顺序表基本操作实现

#include <stdio.h>#define MAX_SIZE 100// 定义顺序表的元素类型 typedef int ElementType;// 定义顺序表结构体 typedef struct {ElementType data[MAX_SIZE];int length; } SeqList;// 初始化顺序表 void InitList(SeqList *L) {L->length 0; }// 插入操作 int Li…

BP网络识别26个英文字母matlab

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;字母识别 获取完整源码源工程文件 一、 设计思想 字符识别在现代日常生活的应用越来越广泛&#xff0c;比如车辆牌照自动识别系统&#xff0c;手写识别系统&#xff0c;办公自动化等等。本文采用BP网络对26个英文字母进行…

优化小地图(非RawImage方法,节省性能)

优化小地图&#xff08;非RawImage方法&#xff0c;节省性能&#xff09; 一、小地图设计二、功能实现1.截取俯视图2.创建Cube包裹住场地&#xff0c;并且创建一个子物体坐标为&#xff08;0,0,0&#xff09;**3.创建UI显示小地图坐标转换代码如下&#xff1a; 一、小地图设计 …

我是如何转行 AI 并且实现薪资翻倍的

大家好啊&#xff0c;我是董董灿。 熟悉我的小伙伴都知道&#xff0c;我之前在北京某211大学&#xff0c;本硕读了7年的机械专业&#xff0c;后来硕士毕业后&#xff0c;果断转行去做了嵌入式开发&#xff0c;随后瞅准了 AI 爆发的时机果断转行去做了AI。 这段经历已经过去了…

【python与机器学习3】,感知机和与非门

1 电子和程序里的与门&#xff0c;非门&#xff0c;或门&#xff0c;与非门 &#xff0c;或非门&#xff0c;异或门 1.1 基础电路 与门&#xff08;AND gate&#xff09;、或门&#xff08;OR gate&#xff09;和非门&#xff08;NOT gate&#xff09;是数字逻辑电路中的三种基…

本地搭建【文档助手】大模型版(LangChain+llama+Streamlit)

概述 本文的文档助手就是&#xff1a;我们上传一个文档&#xff0c;然后在对话框中输入问题&#xff0c;大模型会把问题的答案返回。 安装步骤 先下载代码到本地 LangChain调用llama模型的示例代码&#xff1a;https://github.com/afaqueumer/DocQA&#xff08;代码不是本人…

自动驾驶规划算法

本文将讲解BFS&#xff0c;Dijstra&#xff0c;A*&#xff0c;动态规划的算法原理&#xff0c;不正之处望读者指正&#xff0c;希望有兴趣的读者能在评论区提出一些这些算法的面试考点&#xff0c;共同学习&#xff0c;一起进步 0 图论基础 图有三种&#xff1a;无向图、有向…

SRE 与 DevOps:你知道它们之间区别吗?

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享 DevOps专注于消除阻碍开发和运维之间协作的隔阂&#xff0c;而SRE致力于设计和实施可扩展、可靠的系统&#xff0c;确保最大可靠性。 这篇文章将探讨DevOps和SRE之间的差异&#xff0c…

Podman配置mongodb

文章目录 查询镜像拉取镜像查看镜像运行容器创建root用户 查询镜像 podman search mongo拉取镜像 podman pull docker.io/library/mongo查看镜像 podman images运行容器 podman run -d -p 27017:27017 --namemongodb-test docker.io/library/mongo创建root用户 podman exe…

SSH秘钥登录服务器

一、查看本机 ssh 公钥&#xff0c;生成公钥 1.通过命令窗口 a. 打开你的 git bash 窗口 b. 进入 .ssh 目录&#xff1a;cd ~/.ssh c. 找到 id_rsa.pub 文件&#xff1a;ls d. 查看公钥&#xff1a;cat id_rsa.pub 或者 vim id_rsa.pub git–查看本机 ssh 公钥&#xff0c…

小白--将笔记本上的代码或者项目上传到github上去教程(使用git命令)

文章目录 一、操作教程二、常见问题1. 问题12. 问题2 三、注意 一、操作教程 https://blog.csdn.net/Elon15/article/details/125705706?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170340591716800215092652%2522%252C%2522scm%2522%253A%252220140713.130102…

第六部分 集合论

目录 主要内容 集合的基本概念 集合的基本运算 集合恒等式 初级运算 文氏图 集合的广义并与广义交 广义运算的性质 例1 A{{a},{a,b}} 集合算律 例2 判断下列命题是否为真 例3 设 例4 判断以下命题的真假&#xff0c;并说明理由. 解题思路 主要内容 集合的基本概念 属于、包含…

基于JAVA的超市账单管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…