深度学习-----------------------含并行连结的网络GoogLeNet

news2024/11/13 16:29:19

目录

  • 含并行连结的网络GoogLeNet
    • 最好的卷积层超参数
    • inception块
    • inception 结构
    • inception原始结构
    • inception + 降维
    • 1×1卷积核的降维功能
    • GoogLeNet
      • 段1&2
      • 段3
      • 段4&5
    • Inception 的各种变种
      • Inception V3块,段3
      • Inception V3块,段4
      • Inception V3块,段5
    • 总结
  • Inception块代码
    • 训练模型

含并行连结的网络GoogLeNet

在这里插入图片描述

在这里插入图片描述




最好的卷积层超参数

在这里插入图片描述

为什么选择1×1,3×3,5×5,Max pooling,AvgPool的卷积层?通道数该怎么选?到底用什么样的卷积比较好?
∴引出inception块,inception不用对此进行选择,是都要。(即:在inception块中抽取的有不同的通道,不同的通道有不同的设计,把想要试的东西都放在里面)




inception块

    Inception块是指通过并行使用不同尺寸的卷积核池化操作来捕捉输入数据的不同尺度信息。这种设计允许模型在同一层内并行地处理数据,通过多个分支(或称为’通道’)来提取特征,每个分支可能包含不同数量的卷积层、不同大小的卷积核以及可能的池化层。

    通过将所有这些设计元素(即不同的卷积核大小、卷积层数量、池化操作等)组合在一个Inception块中,模型能够学习并融合来自多个尺度和视角的特征表示。这种‘想要试的东西都放在里面’的策略,实际上是一种高效的特征提取方法,它允许模型自动学习哪些特征对于特定任务是最有用的。


4个路径从不同层面抽取信息,然后在输出通道维合并
在这里插入图片描述




在这里插入图片描述

input(即:输入)被复制了四份,从四条路径走。

pad1:输入和输出高宽一样

pad2:输入和输出等观

这四条路的输出没有改变高宽(跟输入等同高宽),变的是通道数。将这四个在输出通道上进行合并,并不是图片放在一起。


在这里插入图片描述
①白色的卷积用来改变通道数,蓝色的卷积用来抽取信息。
②最左边一条1X1卷积是用来抽取通道信息,其他的3X3卷积用来抽取空间信息。

③输出相同的通道数,5X5比3X3的卷积层参数个数多,3X3比1X1卷积层的参数个数多。

在这里插入图片描述





inception 结构

    传统的CNN结构如AlexNet、VggNet(下图)都是串联的结构,即将一系列的卷积层和池化层进行串联得到的结构。
在这里插入图片描述




inception原始结构

    GoogLeNet 提出了一种并联结构,下图是论文中提出的inception原始结构,将特征矩阵同时输入到多个分支进行处理,并将输出的特征矩阵按深度进行拼接,得到最终输出。

    inception的作用 增加网络深度和宽度的同时减少参数。
在这里插入图片描述

注意:每个分支所得特征矩阵的宽必须相同(通过调整stride和padding),以保证输出特征能在深度上进行拼接




inception + 降维

    在inception的基础上,还可以加上降维功能的结构,如下图所示,在原始 inception 结构的基础上,在分支2,3,4上加入了卷积核大小为1x1的卷积层,目的是为了降维(减小深度),减少模型训练参数减少计算量

在这里插入图片描述

1×1卷积核的降维功能

    同样是对一个深度为512的特征矩阵使用64个大小为5x5的卷积核进行卷积,不使用1x1卷积核进行降维的 话一共需要819200个参数,如果使用1x1卷积核进行降维一共需要50688个参数,明显少了很多。

在这里插入图片描述

注:CNN参数个数 = 卷积核尺寸×卷积核深度 × 卷积核组数 = 卷积核尺寸 × 输入特征矩阵深度 × 输出特征矩阵深度




GoogLeNet

在这里插入图片描述


段1&2

更小的窗口,更多的通道

在这里插入图片描述
大小从224×224➡112×112
公式:(输入大小-卷积核大小+填充*2)// 步幅 +1 = 输出大小
实际计算过程:((224-7)+ 3 * 2 )// 2 + 1= 112
其实可以看stride一般来说数值为多少,就是减多少倍。




段3

在这里插入图片描述



段4&5

在这里插入图片描述




Inception 的各种变种

在这里插入图片描述


Inception V3块,段3

在这里插入图片描述

Inception V3块,段4

在这里插入图片描述

Inception V3块,段5

在这里插入图片描述


在这里插入图片描述




总结

Inception块用4条有不同超参数的卷积层和池化层的路来抽取不同的信息。
    它的一个主要优点是模型参数小,计算复杂度低。
GoogleNet使用了9个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):
    def __init__(self, in_channels, c1, c2, c3, c4, **kwargs): # c1为第一条路的输出通道数、c2为第二条路的输出通道数     
        super(Inception, self).__init__(**kwargs) # python中*vars代表解包元组,**vars代表解包字典,通过这种语法可以传递不定参数。**kwage是将除了前面显式列出的参数外的其他参数, 以dict结构进行接收.                                                    
        self.p1_1 = nn.Conv2d(in_channels, c1, kernel_size=1)
        # 定义第二个卷积层p2_1,它将输入通道数减少到c2[0],卷积核大小为1x1。这是第二条路径的第一步。
        self.p2_1 = nn.Conv2d(in_channels, c2[0], kernel_size=1)
        # 定义第二个卷积层p2_2,它接收p2_1的输出作为输入,输出通道数为c2[1],卷积核大小为3x3,且使用padding=1以保持输入输出的空间尺寸一致。
        self.p2_2 = nn.Conv2d(c2[0], c2[1], kernel_size=3, padding=1)
        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)
        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))  # 第一条路的输出
        # 计算第二条路径的输出,首先通过1x1卷积减少通道数,然后通过3x3卷积,最后应用ReLU激活函数。
        p2 = F.relu(self.p2_2(F.relu(self.p2_1(x))))
        p3 = F.relu(self.p3_2(F.relu(self.p3_1(x))))
        # 计算第四条路径的输出,首先进行最大池化,然后通过1x1卷积,最后应用ReLU激活函数。
        p4 = F.relu(self.p4_2(self.p4_1(x)))
        return torch.cat((p1, p2, p3, p4), dim=1) # 批量大小的dim为0,通道数的dim为1,以通道数维度进行合并
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))  

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

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

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))

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())

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

①在实际的项目当中,我们往往预先只知道的是输入数据和输出数据的大小,而不知道核与步长的大小。

②我们可以手动计算核的大小和步长的值。而自适应(Adaptive)能让我们从这样的计算当中解脱出来,只要我们给定输入数据和输出数据的大小,自适应算法能够自动帮助我们计算核的大小和每次移动的步长。

③相当于我们对核说,我已经给你输入和输出的数据了,你自己适应去吧。你要长多大,你每次要走多远,都由你自己决定,总之最后你的输出符合我的要求就行了。

④比如我们给定输入数据的尺寸是9, 输出数据的尺寸是3,那么自适应算法就能自动帮我们计算出,核的大小是3,每次移动的步长也是3,然后依据这些数据,帮我们创建好池化层。


为了使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)

结果:
在这里插入图片描述




训练模型


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())

结果:
在这里插入图片描述

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

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

相关文章

突破FPGA限制:TS-M4i系列数字化仪利用GPU加速实现高效块平均处理

一、应用背景 块或分段内存平均模式常用于在不同应用当中,移除信号中不相干的噪声。不管是哪家的数字化仪制造商,几乎所有基于FPGA实现的块平均模式都会受到块或者段内存大小的限。该限制一般取决于FPGA的容量,最大样品量通常在32k到500k之间…

RS232(旧协议)与RS485(新协议)

RS232: RS485: RS485和RS232是两种常见的串行通信标准,它们在通信距离、速度、拓扑结构等方面存在显著差异。以下是它们的主要区别: 1. 物理层接口 RS232: 使用单端信号传输,即信号通过一根信号线和一根公共地线(GND&#xff09…

外呼触发通知发送闪信(mod_cti基于FreeSWITCH)

文章目录 前言联系我们手动外呼配置方法例子一:接收到180或183时触发闪信发送例子二:挂断后触发闪信发送 自动外呼配置方法例子:接收到180或183时触发闪信发送 前言 在呼叫中心中间件中,自动外呼触发闪信发送,我们可以…

电销机器人引领电销变革

以前电销都是都是通过盲打,现在有了电话机器人的出现,为电销公司带来新的篇章。 我们都知道外呼中心的人员离职率始终居高不下,人员的培训频繁成本很高,外部电话水平参差不齐,服务态度不够稳定等问题,都是难…

【硬件模块】震动传感器模块

震动传感器模块实物图 DO:数字信号量输出,接单片机管脚; AO:模拟输出,无效,一般不接。 无震动,DO输出高电平,信号指示灯灭; 有震动,DO输出低电平,…

50道深度NLP和人工智能领域面试题+答案

编者按:分享一个很硬核的免费人工智能学习网站,通俗易懂,风趣幽默, 可以当故事来看,轻松学习。 什么是自然语言处理(NLP)?自然语言处理是一种人工智能领域,致力于使计算机…

letcode 分类练习 BST 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先(自底向上的典型例子)

letcode 分类练习 BST 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先 BST530.二叉搜索树的最小绝对差501.二叉搜索树中的众数236. 二叉树的最近公共祖先 BST 重要性质:它的中序遍历是一个有序数组 530.二叉搜索树的最小绝对差 BS…

linux 远程访问及控制 (SSH)

目录 一、SSH远程管理 1.1 配置OpenSSH服务端 1.1.1 SSH协议介绍 1.1.2 服务监听选项 1.1.3 用户登录控制 1.1.4 登录验证方式 1.2 使用SSH客户端程序 1.3 密钥对验证的SSH体系 二、TCP Wrapppers访问控制 2.1 TCP Wrappers概述 2.1.1 TCP Wrappers简介 2.1.2 TCP…

会声会影2023安装好后运行显示乱码的解决方法

会声会影2019安装好了之后,打开软件之后,会有个乱码弹窗错误,其实这个乱码提示只有简体中文版本上才会是乱码, 英文版上显示的是″You do not appear to be a register user. Please re-install the application or call custome…

如何像演示PPT幻灯片一样演示PDF文件 - PDF幻灯片使用说明

PDF幻灯片是一款Windows平台下可以让您像演示PPT幻灯片一样全屏演示PDF文件的放映工具软件。 在我们日常工作中,许多幻灯片文件被转换成了PDF格式。这些由幻灯片生成的PDF文件只能被打开查看内容,但是却不能像原始PPT或PPTX文件一样直接用PowerPoint等软…

常量池梳理

参考资料: 参考视频 参考demo 参考博客 说明: 详情见参考demo的文件夹:

JS逆向高阶补充

文章目录 JS逆向高阶补充eval函数Hook函数案例1: Hook eval案例2: Hook JSON.stringify案例3: Hook JSON.parse案例4: Hook Cookie Promise对象(1)回调函数(2)基本语法(3)then函数(4&#xff09…

wireShark tcpdump 抓包 ,检测dns

开两个窗口执行 1窗口。tcpdump -i any port 53 -w clirent.pcap2窗口。nslookup ip 过滤目标ip or 域名 统计域名DNS 将 生成的 clirent.pcap使用wireshark 分析 1.queryType : A ipv4 AAAAipv6

[word] 复杂文本如何仅全选word中的表格 (简单跟做即可)

问题描述 在word文档中,有各种形式的文本,有纯文本,有表格,有图片或者更多其它形式参杂在一起,本篇记录解决如何只全选中文档中的所有表格形式的部分,从而方便对表格进行批量修改和操作 环境说明 word版…

【系统架构设计】开发方法(二)

【系统架构设计】开发方法(二) 软件生命周期软件开发模型统一过程敏捷方法极限编程特征驱动开发Scrum水晶方法开放式源码ASD 软件重用基于架构的软件设计形式化方法 软件生命周期 软件开发模型 统一过程 敏捷方法 所谓敏捷开发,个人认为&…

day01- Web开发介绍-HTML-CS

Web开发介绍 1 什么是web开发 Web:全球广域网,也称为万维网(www World Wide Web),能够通过浏览器访问的网站。 所以Web开发说白了,就是开发网站的,例如下图所示的网站:淘宝,京东等等 那么我们…

ROS_package 、CMakeLists.txt、package.xml、ROS_node之间的关系

一、整体框架结构 二、关系描述 1、ROS.cpp 里面初始化了一个ROS节点,注意我的源文件里面只初始化了一个节点 // ROS.cpp #include "ros/ros.h"int main(int argc, char **argv) {ros::init(argc, argv, "node_name"); // 指定节点名称为 &…

C++图笔记(三)有向无环图(及最小生成树(略))以及剩下的排序

目录 一,定义: 1,有向无环图 2,拓朴排序 1,每个顶点出现且仅仅出现一次。 2,若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。 二,DAG的性质 性质1…

Clash-Docker在Ubuntu下的使用

说明 最近折腾nas,docker镜像被墙之后很多镜像拉取不了,需要添加代理,这里使用Clash docker版。 安装&运行 docker pull dreamacro/clash:v1.18.0 docker run -d --name clash --network host dreamacro/clash:v1.18.0修改配置文件 d…

java使用itext 直接生成pdf

itext 使用 需求背景itext 的使用依赖简单示例基础设置(页面大小、边距、字体等)段落内部,特殊设置关键字 字体或颜色生成动态表格页脚展示页数其他设置密码添加水印(背景图)目录Header, Footer分割 PDF合并 PDF 需求背…