含并行连结的网络(GoogLeNet)

news2025/2/24 6:00:52

目录

1.GoogLeNet

2.代码


1.GoogLeNet

inception不改变高宽,只改变通道数。GoogLeNet也大量使用1*1卷积,把它当作全连接用。

    

    

V3耗内存比较多,计算比较慢,但是精度比较准确。

2.代码

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

"""inceeption 块"""
class Unception(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.p2_1=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)
        #批量大小的维度是0,通道数的维度是1,所以在输出通道的维度上叠加起来。


#为什么GoogLeNet这个网络如此有效呢? 首先我们考虑一下滤波器(filter)的组合,它们可以用
#各种滤波器尺寸探索图像,这意味着不同大小的滤波器可以有效地识别不同范围的图像细节。 同时,
#我们可以为不同的滤波器分配不同数量的参数。



"""GoogLeNet模型"""
#逐一实现GoogLeNet的每个模块。第一个模块使用64个通道、7*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))
                    #图片大小减半

#第二个模块使用两个卷积层:第一个卷积层是64个通道、1*1卷积层;第二个卷积层使用将通道数量
#增加三倍的3*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))

#第三个模块串联两个完整的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))


#第四模块更加复杂, 它串联了5个Inception块
b4 = nn.Sequential(Inception(480, 192, (96, 208), (16, 48), 64),
                   #输入的大小为第3模块最后输出的4条道路的通道数加起来
                   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))


#第五模块包含两个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))


#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])"""



""" 训练模型"""
#使用Fashion-MNIST数据集来训练我们的模型。在训练之前,我们将图片转换为96*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"""


  • Inception块相当于一个有4条路径的子网络。它通过不同窗口形状的卷积层和最大汇聚层来并行抽取信息,并使用1×1卷积层减少每像素级别上的通道维数从而降低模型复杂度。

  • GoogLeNet将多个设计精细的Inception块与其他层(卷积层、全连接层)串联起来。其中Inception块的通道数分配之比是在ImageNet数据集上通过大量的实验得来的。

  • GoogLeNet和它的后继者们一度是ImageNet上最有效的模型之一:它以较低的计算复杂度提供了类似的测试精度。

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

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

相关文章

未来的NAS:连接您的数字生活

未来的NAS:连接您的数字生活 引言 网络附加存储(Network Attached Storage,简称NAS)是一种通过网络连接的存储设备,用于集中存储和共享数据。传统的NAS设备通常包含一个或多个硬盘驱动器,可以通过局域网连…

2024.1.14每日一题

LeetCode 83.删除排序链表中的重复元素 83. 删除排序链表中的重复元素 - 力扣(LeetCode) 题目描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输…

.NET 8.0 发布到 IIS

如何在IIS(Internet信息服务)上发布ASP.NET Core 8? 在本文中,我假设您的 Windows Server IIS 上已经有一个应用程序池。 按照步骤了解在 IIS 环境下发布 ASP.NET Core 8 应用程序的技巧。 您需要设置代码以支持 IIS 并将项目配…

我的年终总结2023

As a DBA 从2023年初开始,我就给自己定下了23年的主要任务——学习PostgreSQL数据库。虽然没有定下细致的计划,但总体的目标是把PG的一些基础知识学完。后来发现我想简单了,学习PG的成本比我想象的多的多,导致23年这个目标没有完…

前端踩坑之——antDesignVue的upload组件

本地启动时控制台会报404,放到服务器上控制台会报405(多发一个请求) 原因:upLoad有默认的上传事件 解决:阻止默认事件即可 beforeUpload Hook function which will be executed before uploading. Uploading will be stopped with false or …

修复uni-simple-router@2.0.7版本query参数null的bug

问题:query参数为null或者为空时,插件内部参数校验问题导致的会报错:TypeError: Cannot convert undefined or null to object at Function.keys 源码修改如下: 通过打补丁的方式修复query参数类型校验问题 1. 安装patch-packag…

Git项目分支管理规范

一、分支管理 创建项目时,会针对不同环境创建两个常设分支(也可以算主分支,永久不会删除) master:生产环境的稳定分支,生产环境基于该分支构建。仅用来发布新版本,除了从release测试分支或 hotfix-*Bug修复分支进行m…

风丘电动汽车高压测试方案 助您高效应对车辆试验难题

针对电动汽车道路试验的要求,风丘科技携手德国IPETRONIK共同推出了电动汽车高压测试方案。电动汽车测试通常有两种测量手段:第一种是测量模拟量信号,包括电压、电流、温度和高压;第二种是使用数据记录仪或CAN卡从车辆总线读取数据…

飞凌嵌入式这2款核心板已完成“矿鸿OS”适配,矿企伙伴看过来

近日,飞凌嵌入式FETA40i-C和FETMX6ULL-S两款核心板成功完成“矿鸿OS”的系统适配,嵌入式核心板与“矿鸿”操作系统的结合与应用,将进一步推动煤矿行业的数字化、智能化进程。 矿鸿OS(矿山鸿蒙系统)是华为和国家能源集团…

明胶清灰除杂技术,明胶清灰除杂树脂T-42MP

Tulsimer T-42MP明胶等清灰除杂用大孔吸附净化树脂 明胶是一种水溶性非均相的分子量蛋白质混合物。它不以单质的形式存在于自然界中,只有通过控制水解胶原蛋白来得到,它存在于动物的皮肤,肌腱,韧带,骨骼中。广泛应用于…

2024年AMC8历年真题练一练和答案详解(10),以及全真模拟题

六分成长继续为您分享AMC8历年真题,最后两天通过高质量的真题来体会快速思考、做对题目的策略。 题目从575道在线题库(来自于往年真题)中抽取5道题,每道题目均会标记出自年份和当年度的序号,并附上详细解析。【使用六…

day20【LeetCode力扣】142.环形链表Ⅱ

day20【LeetCode力扣】142.环形链表Ⅱ 1.题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了…

几内亚ECTN是什么?怎么办理?建议收藏!

几内亚ECTN是什么?怎么办理?建议收藏! 一、去往几内亚的货物,从六月一日开始强制实施ECTN制度,取消原来并行的ENS制度。如若货物到港前没申请ECTN,几内亚海关将会强行扣货。 ECTN是英文:ELECTR…

Js-web APIs(一)

目录 Web API 基本认知 • 作用和分类 • 什么是DOM • DOM树 • DOM对象(重要) 获取DOM对象 • 根据CSS选择器来获取DOM元素 (重点) 1.选择匹配的第一个元素 2.选择匹配的多个元素 • 其他获取DOM元素方法(了解) 操作元素内容 • 对象.innerT…

Linux系统使用超详细(十)~vi/vim命令②

承接上篇文章的整理,本篇将继续梳理汇总vi/vim命令的其他用法! 目录 一、使用vim编辑多个文件 1.1命令使用参数o和O 1.2命令使用参数p 1.3切换标签页 1.4移动标签页 1.5编辑创建新文件 1.6关闭文件 1.7命令不使用参数 二、文件对比 2.1md5sum函…

2024“华数杯”(A题)放射性 Tritium 污染问题国际大学生数学建模竞赛| 建模秘籍文章代码思路大全

铛铛!小秘籍来咯! 小秘籍希望大家都能轻松建模呀,华数杯也会持续给大家放送思路滴~ 抓紧小秘籍,我们出发吧~ 完整内容可以在文章末尾领取! 问题重述: 2024 “Huashu Cup” 国际数学建模大赛 - Proble…

Vue加载序列帧动图

解读方法 使用<img :src"currentFrame" alt"加载中" /> 加载图片动态更改src的值使用 requestAnimationFrame 定时更新在需要的页面调用封装的组件 <LoadToast v-if"showLoading" /> 封装组件 <template><div class"…

热压机PLC数据采集远程监控物联网解决方案

热压机PLC数据采集远程监控物联网解决方案 随着工业4.0时代的到来&#xff0c;智能制造已经成为制造业发展的重要方向。在热压机领域&#xff0c;PLC数据采集远程监控物联网解决方案为提高生产效率、降低维护成本、优化生产工艺提供了有效的手段。 一、热压机PLC数据采集远程…

冻结Prompt微调LM: T5 PET (a)

T5 paper: 2019.10 Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer Task: Everything Prompt: 前缀式人工prompt Model: Encoder-Decoder Take Away: 加入前缀Prompt&#xff0c;所有NLP任务都可以转化为文本生成任务 T5论文的初衷如…

FFMPEG命令生成各国国旗

文章目录 亚洲篇中国~待完善朝鲜~待补充韩国~待补充蒙古~待补充日本越南~待补充老挝 欧洲篇挪威~待补充瑞典~待补充芬兰~待补充冰岛~待补充丹麦~待补充爱沙尼亚拉脱维亚立陶宛白俄罗斯~待补充乌克兰摩尔多瓦~待补充俄罗斯德国 亚洲篇 中国~待完善 先画个五角星 在100x100的画…