《动手学深度学习 Pytorch版》 7.4 含并行连接的网络(GoogLeNet)

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

7.4.1 Inception块

GoogLNet 中的基本卷积块叫做 Inception 块(大概率得名于盗梦空间),由 4 条并行路径组成。

前 3 条路径使用窗口大小为 1 × 1 1\times 1 1×1 3 × 3 3\times 3 3×3 5 × 5 5\times 5 5×5 的卷积层;

中间 2 条路径在输入上执行 1 × 1 1\times 1 1×1 卷积,以减少通道数,从而降低模型的复杂度;

第 4 条路径使用 3 × 3 3\times 3 3×3 的最大汇聚层;

最后使用 1 × 1 1\times 1 1×1 卷积层改变通道数。

回避了用哪种卷积核的问题,小孩子才做选择,Google全部都要。

在这里插入图片描述

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)

7.4.2 GoogLeNet 模型

GoogLetNet 一共使用 9 个 Inception 块和全局平均汇聚层来生成其估计值。

  • Inception块之间的最大汇聚层可降低维度

  • 第一个模块类似于AlexNet和LeNet,Inception块的组合从VGG继承

  • 全局平均汇聚层避免了在最后使用全连接层。

在这里插入图片描述

b1 = nn.Sequential(  # 第一个模块使用64个通道、3*3的卷积层。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(  # 第二个模块使用一个64个通道、1*1卷积层的卷积层和一个卷积层使用192的通道、3*3的卷积层。这对应于Inception块中的第二条路径。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))b3 = nn.Sequential(  # 串联两个Inception模块Inception(192, 64, (96, 128), (16, 32), 32),  # 输出通道数为 64+128+32+32=256  各路径输出比例为 64:128:32:32=2:4:1:1Inception(256, 128, (128, 192), (32, 96), 64),  # 输出通道数为 128+192+96+64=480  各路径输出比例为 128:196:96:64=4:6:3:2nn.MaxPool2d(kernel_size=3, stride=2, padding=1))b4 = nn.Sequential(  # 串联五个Inception模块 Inception(480, 192, (96, 208), (16, 48), 64),  # 输出通道数为 192+208+48+64=512Inception(512, 160, (112, 224), (24, 64), 64),  # 输出通道数为 160+224+64+64=512Inception(512, 128, (128, 256), (24, 64), 64),  # 输出通道数为 128+256+64+64=512Inception(512, 112, (144, 288), (32, 64), 64),  # 输出通道数为 112+288+64+64=528Inception(528, 256, (160, 320), (32, 128), 128),  # 输出通道数为 256+320+128+128=832nn.MaxPool2d(kernel_size=3, stride=2, padding=1))b5 = nn.Sequential(  # 串联两个Inception模块Inception(832, 256, (160, 320), (32, 128), 128),  # 输出通道数为 256+320+128+128=832Inception(832, 384, (192, 384), (48, 128), 128),  # 输出通道数为 384+384+128+128=1024nn.AdaptiveAvgPool2d((1,1)),nn.Flatten())net = nn.Sequential(b1, b2, b3, b4, b5, nn.Linear(1024, 10))
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])

7.4.3 训练模型

lr, num_epochs, batch_size = 0.1, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)  # 输入宽高降为96以减小计算量
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())  # 大约需要二十分钟,慎跑
loss 0.297, train acc 0.887, test acc 0.861
542.8 examples/sec on cuda:0

在这里插入图片描述

练习

(1)GoogLeNet 有一些后续版本如下,尝试实现并运行它们,并观察实验结果。

a. 添加批量规范层b. 对 Inception 进行调整c. 使用标签平滑进行模型正则化d. 加入残差连接

(2)使用 GoogLeNet 的最小图像大小是多少?

最小图像大小应该是 3 × 3 3\times 3 3×3

因为 5 × 5 5\times 5 5×5卷积核、2填充、1步幅至少需要 3 × 3 3\times 3 3×3大小的图像才能使输出大于零


(3)将AlexNet、VGG 和 NiN 的模型参数大小与 GoogLeNet 进行比较。后两个网络架构是如何显著减少模型参数大小的?

1 × 1 1\times 1 1×1 的卷积数取代全连接层让参数变小。

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

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

相关文章

华为云云耀云服务器L实例评测|使用云耀云服务器L实例,自行搭建NextCloud

背景 本人是搞分布式存储的,一心想搭个网盘,发现L实例里面就有个网盘实例最低配置是2核4G,为了节省成本,选个【2核2G】的配置,一样可以搭起来。 简介 Nextcloud是一款开源免费的私有云存储网盘项目,可以让…

clickhouse学习之路----clickhouse的特点及安装

clickhouse学习笔记 反正都有学不完的技术,不如就学一学clickhouse吧 文章目录 clickhouse学习笔记clickhouse的特点1.列式存储2. DBMS 的功能3.多样化引擎4.高吞吐写入能力5.数据分区与线程级并行 clickhouse安装1.关闭防火墙2.CentOS 取消打开文件数限制3.安装依…

DATE和LocalDateTime在Java中有什么区别

在Java中,Date和LocalDateTime是两个表示日期和时间的类,它们有以下区别: 类型:Date是Java旧版提供的日期和时间类,而LocalDateTime是Java 8引入的新日期和时间API中的类。 不可变性:Date是可变类&#x…

深入理解C#中委托的使用及不同类型委托的应用示例

在C#中,委托是一种强大而灵活的机制,可以引用一个或多个方法,并允许以类似函数指针的方式进行调用。委托在事件处理、回调函数和多线程编程等场景中非常有用。本文将深入探讨C#中委托的使用,并介绍不同类型委托的应用示例。 目录…

Fiddler抓包工具配置+Jmeter基本使用

一、Fiddler抓包工具的配置和使用 在编写网关自动化脚本之前,得先学会如何抓包,这里以Fiddler为例。会抓包的同学可以跳过这一步,当然看看也是没坏处的…… 局域网络配置 将要进行抓包的手机与电脑连入同一局域网,电脑才能够抓到…

【深度学习实验】前馈神经网络(八):模型评价(自定义支持分批进行评价的Accuracy类)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. __init__(构造函数) 2. update函数(更新评价指标) 5. accumulate(计算准确率) 4. reset(重置评价指标) 5. 构造数据进行测试 6. 代码整合 一、实验介绍 本文将实…

react多条件查询

1、声明一个filter常量 2.filter接受(condition,data)两个参数 3、调用data里面的filter进行筛选 4、任意一个item当筛选条件 5、使用object.key获取对象所有key 6、对每个key使用Array.prototype.every()方法判断是否满足条…

华为数通方向HCIP-DataCom H12-821题库(单选题:361-380)

第361题 如图所示是一台路由器的BGP输出信息。那么以下关于这段信息的描述,错误的是哪一项? <Huawei>display bgp error Error Type: Peer Error Peer Address:10.1.1.2 VRFName:Public Error Info: Router-ID conflictA、该路由器邻居地址是10.1.1.2 B、Error Type显…

电脑计算机xinput1_3.dll丢失的解决方法分享,四种修复手段解决问题

日常生活中可能会遇到的问题——xinput1_3.dll丢失的解决方法。我相信&#xff0c;在座的很多朋友都曾遇到过这个问题&#xff0c;那么接下来&#xff0c;我将分享如何解决这个问题的解决方法。 首先&#xff0c;让我们来了解一下xinput1_3.dll文件。xinput1_3.dll是一个动态链…

【数据结构】什么是数据结构?

数据结构(Data Structure)是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合. 这么讲可能有些抽象,放一张图大家可能好理解一点: 上图依次是数据结构中逻辑结构中的:集合结构,线性结构,树形结构,图形结构. 而: 数据结构是一门研究非数值计算的程…

分库分表MySQL

目录 Mycat入门 分片配置 分片配置(配置Mycat的用户以及用户的权限) 启动服务 登录Mycat Mycat配置 schema.xml 1.schema标签:配置逻辑库,逻辑表的相关信息 1-1.核心属性 1-2.table标签 2.datanode标签:配置数据节点的相关信息 核心属性 3.datahost标签:配置的是节…

【性能测试】JMeter:集合点,同步定时器的应用实例!

一、集合点的定义 在性能测试过程中&#xff0c;为了真实模拟多个用户同时进行操作以度量服务器的处理能力&#xff0c;可以考虑同步虚拟用户以便恰好在同一时刻执行操作或发送请求。 通过插入集合点可以较真实模拟多个用户并发操作。 (注意&#xff1a;虽然通过加入集合点可…

蓝牙核心规范(V5.4)10.2-BLE 入门笔记之CIS篇

LE CIS 同步通信 同步通信提供了一种使用蓝牙LE在设备之间传输有时间限制的数据的方式。它提供了一个机制,允许多个接收器设备在不同的时间从相同的源接收数据,以同步它们对该数据的处理。LE AUDIO使用同步通信。 当使用同步通信时,数据具有有限的时间有效期,在到期时被认…

第1篇 目标检测概述 —(1)目标检测基础知识

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测是计算机视觉领域中的一项任务&#xff0c;旨在自动识别和定位图像或视频中的特定目标&#xff0c;目标可以是人、车辆、动物、物体等。目标检测的目标是从输入图像中确定目标的位置&#xff0c;并使用边界框将其标…

Linux指令(ls、pwd、cd、touch、mkdir、rm)

whoami who pwd ls ls -l clearls指令 ls ls -l ls -a :显示当前目录下的隐藏文件&#xff08;隐藏文件以.开头&#xff09;ls -a -l 和 ls -l -a 和 ls -la 和 ls -al &#xff08;等价于ll&#xff09; pwd命令 显示用户当前所在的目录 cd指令 mkdir code &#xff08;创建…

PPT系统化学习 - 第1天

文章目录 更改PPT主题更改最大撤回次数自动保存禁止PPT压缩图片字体嵌入PPTPPT导出为PDFPPT导出为图片PPT导出为图片型幻灯片PPT导出成视频添加参考线设置默认字体设置默认形状建立模板、保存模板、使用模板建立模板保存模板使用模板 更改PPT主题 更改PPT的主题&#xff1a; 夜…

【Vue】轻松理解数据代理

hello&#xff0c;我是小索奇&#xff0c;精心制作的Vue教程持续更新哈&#xff0c;想要学习&巩固&避坑就一起学习叭~ Object定义配置方法 代码 引出数据代理&#xff0c;先上代码&#xff0c;后加解释 <!DOCTYPE html> <html><head><meta cha…

《从零开始的Java世界》01基本程序设计

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…

【20230921】关于sing-box命令行程序开机自启动运行(Windows、Linux)

1 背景 sing-box是一个命令行程序&#xff0c;官网给出的教程是复制链接到Git Bash&#xff08;windows&#xff09;或终端运行&#xff08;Linux&#xff09;。每次开机都进行复制运行是一件繁琐的事情。 复制的内容其实就是下次并运行shell脚本&#xff0c;其实系统只需要运…

2、SpringBoot_依赖介绍

三、SpringBoot介绍 1.parent 前言&#xff1a;之前是使用spring/springmvc 开发&#xff0c;整合不同的组件会有很多依赖&#xff0c;这些依赖会涉及到很多的版本信息&#xff0c;版本信息多了之后可能会导致版本冲突问题概述&#xff1a;把很多组件技术的搭配放到一起&…