pytorch深度学习实战lesson26

news2025/8/3 20:04:07

第二十六课 GoogLeNet

       这节课学习Googlenet , 虽然 nin 现在几乎没有被使用,但是 Googlenet 还是在大量的被使用。在比如说 Google 内部当然是用的挺多的,在外面也是被经常使用。这个网络当时候出来的时候也是吓了大家一跳。

       如上图所示,它是第一次做一个几乎快到100层的卷积层。而且可以看到它的名字 L 是大写的,所以它是致敬了lenet。然后它在 IMAG net上拿了挺好的成绩,是老冠军。

目录

理论部分

实践部分


理论部分

有这么多个选择,那么到底用谁比较好呢?

       Google net 里面最重要的叫做 inception 块,就是说你我不给你做选择,我全都要:每个块里面抽取不同的通道,然后不同通道有不同的设计,把想要的那些东西都放在里面。这就是 inception 块的想法。

       可以看到输入有四条路。第一条路是输入先接到一个1乘1的卷积层里面,再输出;然后第二条路先通过一个1乘1的卷积层对通道做变换,再输入到3乘3的卷积层里面, pad 等于1,使得输入和输出的高宽是一样的;第三条路输入又是一个1乘1的卷积层来对通道数做变换,不改变高宽。但是就是说通过一个5乘5的卷积层来做一些空间信息, pad =2:输入和输出等宽;第四路是用了一个3乘3的 max pulling, pad 等于1,然后再在后面加一个1乘1的卷积层。

       所以所有四条路的输出没有改变高宽,因此最后可以把它们合并起来。高宽不变,那变的是什么?变的其实是通道数。

       假设输入通道数是192,高宽是28的话(不用管,反正不会变对吧)。如上图所示,我把输入通道从192变成了输出的256。这里的设计要点就在于把重要的那些参数留给我们觉得比较重要的那些通道。

       可见inception 不仅得增加了网络层的多样性,参数数变少了,计算量也变低了,所以这也就是它的好处。

       Google net 大量使用1乘1的卷积,它很多时候也是当全连接在用(就是把通道数做变换),第二个是它也使用了全局的平均值池化层,但不一样的是它没有一定要设计 inception block 使得最后一个 inception block 的输出通道数等于类别个数。

        前面两个段虽然卷积层不多,但是也可以很快的把通道拉上去,把高宽减下去,使得后面的计算可控。这一点它确实比 alexnet 还是要好一点 ,alexnet 直接降到12了,Google Net还有28乘28,所以说可以认为Google Net用了更小的卷积层,但是高宽保留的更多一点,这样使得后面能支撑更深的一些网络。

        Stage3又把通道数从输入的192扩大到了480,但是里面每个层的参数并没有什么技巧去配置,它只是说千万次的实验后才得出来的。

        段四和段五也是一样的,你根本就不知道他里面到底是怎么样算,所以导致 Google net 那个论文特别的难以复现。但总体的原则还是增加通道数,增加到了1024。是vgg的两倍。

        V 2就是加入了 bachelalization;v3 上面他又去重新去看了一下 inception block 他看了看里面还有什么样的可以调的东西;然后 v4 的话就在 v3 的基础上加入了残差连接

下面三张图是Googlenet对于段3,4,5比较新颖的做法,都比较奇怪。。。

        v3这个东西虽然很诡异,但是实际上效果还是挺好的。虽然速度不是很快,但是精度很理想。

实践部分

 

代码:

#含并行连结的网络(GoogLeNet)
#Inception块
import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l
import matplotlib.pyplot as plt
class Inception(nn.Module):
    def __init__(self, in_channels, c1, c2, c3, c4, **kwargs):#c1,c2,c3,c4c分别表示每一个path的通道数
        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)#return是在输出通道数等于1时,把这四个东西给你concat起来。
#GoogLeNet模型
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))
'''第二个模块使用两个卷积层:第一个卷积层是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.MaxPool2d(kernel_size=3, stride=2, padding=1))
'''第三个模块串联两个完整的Inception块。 
第一个Inception块的输出通道数为\(64+128+32+32=256\),
四个路径之间的输出通道数量比为\(64:128:32:32=2:4:1:1\)。
第二个和第三个路径首先将输入通道的数量分别减少到\(96/192=1/2\)和\(16/192=1/12\),然后连接第二个卷积层。
第二个Inception块的输出通道数增加到\(128+192+96+64=480\),
四个路径之间的输出通道数量比为\(128:192:96:64 = 4:6:3:2\)。 
第二条和第三条路径首先将输入通道的数量分别减少到\(128/256=1/2\)和\(32/256=1/8\)。'''
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))
'''第四模块更加复杂, 它串联了5个Inception块,
其输出通道数分别是\(192+208+48+64=512\)、\(160+224+64+64=512\)、\(128+256+64+64=512\)、
\(112+288+64+64=528\)和\(256+320+128+128=832\)。 
这些路径的通道数分配和第三模块中的类似,
首先是含\(3×3\)卷积层的第二条路径输出最多通道,其次是仅含\(1×1\)卷积层的第一条路径,
之后是含\(5×5\)卷积层的第三条路径和含\(3×3\)最大汇聚层的第四条路径。 
其中第二、第三条路径都会先按比例减小通道数。 这些比例在各个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))
'''第五模块包含输出通道数为\(256+320+128+128=832\)和\(384+384+128+128=1024\)的两个Inception块。 
其中每条路径通道数的分配思路和第三、第四模块中的一致,只是在具体数值上有所不同。 
需要注意的是,第五模块的后面紧跟输出层,该模块同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())
net = nn.Sequential(b1, b2, b3, b4, b5, nn.Linear(1024, 10))
#为了使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())
plt.show()

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])
training on cuda:0
<Figure size 350x250 with 1 Axes>
。。。。
loss 0.238, train acc 0.909, test acc 0.894
1023.0 examples/sec on cuda:0

进程已结束,退出代码0

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

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

相关文章

到底该怎么学python啊?

前言 大家都说找工作有金九银十&#xff0c;经过了金九银十之后&#xff0c;很多小伙伴都纷纷入职了各家企业&#xff0c;在各个企业中扮演者不同的角色&#xff0c;其中我接触最多的就是算法工程师和Python开发工程师&#xff0c;也跟其他企业的相关技术负责人交流过&#xf…

11月25日:tp框架中的架构,配置,路由,控制器

tp框架的主要内容 架构&#xff1a; https://static.kancloud.cn/manual/thinkphp5/118010 配置&#xff1a; 配置文件主要位置 可以使用Config::load()调用thinkphp中的静态方法&#xff0c;显示出config.php的主要内容 路由&#xff1a; 图中可见 使用url::调用静态方法…

Spring Boot集成Easypoi导出Excel

目录 1.引入Maven依赖 2.实体类属性加上Excel注解 3.导出示例 4.导出结果 5.注解Excel说明 1.引入Maven依赖 <!--easypoi依赖&#xff08;表格导入导出&#xff09;--> <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-sp…

【愚公系列】2022年11月 数据库-数据库文档生成工具SmartSQL使用

文章目录前言一、数据库文档生成工具SmartSQL使用1.SmartSQL的功能介绍2.运行3.连接数据库4.分组管理5.数据表相关功能6.导入导出7.文档截图7.1 CHM文档7.2 MD文档ABTABAC_MAPPING 7.3 EXCEL文档7.4 PDF文档7.5 HTML文档7.6 XML文档7.7 JSON文档前言 SmartSQL 是一款方便、快捷…

Photographic Tone Reproduction for Digital Images

Abstract 经典的摄影任务是将现实世界亮度的潜在高动态范围映射到摄影印刷品的低动态范围。将数字图像映射到低动态范围的打印或屏幕的计算机图形从业者也面临着这种音调再现问题。本文介绍的工作利用了经过时间考验的摄影实践技术来开发新的色调再现算子。特别是&#xff0c;…

进程的调度

目录 1. 进程的概念 2.进程是如何被调度的 2.1描述 2.2 组织 2.3 PCB中描述的进程特征 2.4 进程调度的相关属性&#xff08;接2.3&#xff09; 3. 内存管理 1. 进程的概念 一个跑起来的程序就称之为进程(没跑起来就不是进程) 进程是操作系统分配资源的基本单位。 2.进程…

说说原型(prototype)、原型链

1、原型 prototype 和 proto 每个对象都有一个__proto__属性&#xff0c;并且指向它的prototype原型对象 每个构造函数都有一个prototype原型对象 prototype原型对象里的constructor指向构造函数本身 看一下代码就清楚了 function Person(nick, age){this.nick nick;this.…

数据结构学习笔记(Ⅳ):串

目录 1 串 1.1 定义与基本操作 1.定义 2.基本操作 1.2 串的存储结构 1.顺序存储 2.链式存储 3.基于顺序存储实现基本操作 2 串的朴素模式匹配算法 2.1 朴素模式匹配算法 2.2 KMP算法 1.优化思路 2.计算next数组 2.3 KMP算法优化 1 串 1.1 定义与基本操作 1.定义…

02.OpenWrt-进入开发板系统

02.OpenWrt-进入开发板系统 进入系统就是连接到系统shell,可是输入命令.说到shell第一个想到windows系统的PowerShell,在windows系统上多使用图形界面的方式进行与系统交互,毕竟windows的精髓就是图形界面,很少使用PowerShell命令.其实PowerShell的功能也非常强大,有时候记住一…

Flutter高仿微信-第38篇-单聊-转账

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 详情请参考 Flutter高仿微信-第29篇-单聊 &#xff0c; 这里只是提取小视频的部…

【C++】Cmake使用教程(看这一篇就够了)

文章目录引言一 环境搭建二 简单入门2.1 项目结构2.2 示例源码2.3 运行查看三 编译多个源文件3.1 在同一个目录下有多个源文件3.1.1 简单版本3.1.1.1 项目结构3.1.1.2 示例代码3.1.1.3 运行查看3.1.2 进阶版本3.1.2.1 项目结构3.1.2.2 示例源码3.1.2.3 运行查看3.2 在不同目录下…

热门编程语言那么多,该选择哪个

编程语言那么多&#xff0c;该怎么选呢&#xff1f;无论是对找工作、还是打算转行新领域的同学们&#xff0c;起初都会有这样的困扰。这时候了解清楚编程语言的种类&#xff0c;到底该选哪个方向&#xff1f;将来能从事哪些岗位的工作&#xff1f;就比较重要了。与其盲目随从他…

CAS号:376364-38-4,rCRAMP (rat)

rCRAMP (rat) 是一种大鼠组织蛋白酶相关的抗菌肽&#xff0c;有助于大鼠脑肽/蛋白质提取物的抗菌活性。rCRAMP (rat) 是大鼠中枢神经系统先天免疫系统的关键参与者。rCRAMP (rat) is the rat cathelin-related antimicrobial peptide. rCRAMP (rat) contributes to the antibac…

计算机网络协议------从入门到深化

计算机网络通信 什么是通信协议 简单来说&#xff0c;通信协议就是计算机之间通过网络实现通信时事先达成 的一种“约定”&#xff1b;这种“约定”使那些由不同厂商的设备&#xff0c;不同CPU及不 同操作系统组成的计算机之间&#xff0c;只要遵循相同的协议就可以实现通 信。…

数据治理容易走进哪些误区?

在业界&#xff0c;大家都为如何做好数据治理而感到困惑。数据治理工作一定要先摸清楚数据的家底&#xff0c;规划好路线图&#xff0c;再进行决策。不然很容易走进误区中&#xff0c;无法自拔。下面总结了数据治理的7个常见误区&#xff0c;并给出一定建议&#xff0c;希望给予…

ERD Online 4.0.3_fix 元数据在线建模(免费、私有部署)

❝ 修复数据源导入的元数据&#xff0c;在没有中文注释修改的时候&#xff0c;导致表消失修复页面刷新导致404修改是否在关系图中显示的提示一键部署增加两种部署方式&#xff1a;IPPORT、DOMAIN增加手动部署方式、极大程度的实现部署定制化❞以 「root」 用户登录 Linux 主机执…

面试:dumpsys meminfo 内存信息含义

查看内存信息&#xff1a; adb shell dumpsys meminfo dumpsys meminfo显示的信息如图所示&#xff1a; 这里仅介绍我们需要重点关注的字段&#xff1a; Dalvik Heap&#xff1a;虚拟机占用的内存&#xff0c;可以理解为Java层占用的内存。Native Heap&#xff1a;Native层占…

python 循环引用的解决方法

目录 1、问题描述 2、原因 3、示例 4、解决办法 1、问题描述 编写python代码&#xff0c;运行中出现了&#xff1a;‘most likely due to a circular import ’ 这样的报错。 2、原因 循环引用问题&#xff0c;即A引用了B&#xff0c;B又引用了A&#xff0c;造成循环引用…

ctp交易接口股票怎么查询历史数据?

针对于ctp交易接口股票历史数据的查询&#xff0c;其基本原理就是利用api接口开发子系统最终就是开发完成并暴露一个标准的HTTPAPI接口&#xff0c;并将接口注册和接入到API网关。API设计和开发的核心思想仍然应该是基于领域对象建模驱动&#xff0c;通过领域对象建模很好的实现…

激光数据去畸变

机器人在使用激光雷达时必然会遇到的一个问题就是激光雷达数据去畸变。为什么会产生畸变呢&#xff0c;这是因为激光雷达产生激光数据时如果机器人在运动&#xff0c;那么就会产生运动畸变。 在ros下使用激光雷达时&#xff0c;激光数据是相对于激光本体坐标系的。画个图看下会…