004-GoingDeeperConvolutions2014(googLeNet)

news/2024/5/3 11:16:01/文章来源:https://www.cnblogs.com/guixu/p/16689418.html

Going Deeper with Convolutions #paper


1. paper-info

1.1 Metadata

  • Author:: [[Christian Szegedy]], [[Wei Liu]], [[Yangqing Jia]], [[Pierre Sermanet]], [[Scott Reed]], [[Dragomir Anguelov]], [[Dumitru Erhan]], [[Vincent Vanhoucke]], [[Andrew Rabinovich]]
  • 作者机构::
  • Keywords:: #DeepLearning , #GoogLeNet
  • Journal:: -
  • Date:: [[2014-09-16]]
  • 状态:: #Doing
  • 链接: PDF

1.2 Abstract

We propose a deep convolutional neural network architecture codenamed Inception, which was responsible for setting the new state of the art for classification and detection in the ImageNet Large-Scale Visual Recognition Challenge 2014 (ILSVRC14). The main hallmark of this architecture is the improved utilization of the computing resources inside the network. This was achieved by a carefully crafted design that allows for increasing the depth and width of the network while keeping the computational budget constant. To optimize quality, the architectural decisions were based on the Hebbian principle and the intuition of multi-scale processing. One particular incarnation used in our submission for ILSVRC14 is called GoogLeNet, a 22 layers deep network, the quality of which is assessed in the context of classification and detection.

设计了一个更宽更深的网络,设计原则符合Hebbian principle和多尺度处理原则。在2014的ImageNet比赛上取得了第一的好成绩。(分类和探测)

https://zh.m.wikipedia.org/zh-my/赫布理论
Hebbian principle

1.3 Introduction

GoogLeNet在分类和目标检测中都取得了重大的突破;并且算法复杂度和计算机资源利用率上都取得了重要的成功。最重要的一点,该算法由于优秀的性能,能够很好的部署到端设备中,方便使用。

提出了一种新的网络结构,命名为Inception,改名字来源于Network in network 和盗梦空间的台词we need to go deeper


图 1-1 表情包
本网络结构中的deep有两种意思: + Inception module: 一种新的网络结构,更深层次的理解 + 整体意义上的深层网络结构 `1x1`卷积在本结构中的作用: + 降维 + 增加网络深度 + 节约计算机资源 在目标检测中使用了`multi-box prediction` 以及更好地对边界框建议进行分类的集合方法。

1.4 Motivation

增加网络深度最容易的方法就是增加网络层数,但这容易带来过拟合和计算量过大的问题。解决问题的方法是从完全连接的架构转向稀疏连接的架构,即使在卷积内部也是如此。

The fundamental way of solving both issues would be by ultimately moving from fully connected to sparsely connected architectures, even inside the convolutions.

但是这种稀疏结构模型对计算机来说计算并不高效。

Also, non-uniform sparse models require more sophisticated engineering and computing infrastructure.

并且卷积是由密集连接的集合来实现的。

Inception 架构最初是作为第一作者的案例研究开始的,用于评估复杂网络拓扑构建算法的假设输出,该算法试图近似稀疏结构,并通过密集的,可读的可用组件覆盖假设的结果。

The Inception architecture started out as a case study of the first author for assessing the hypothetical output of a sophisticated network topology construction algorithm that tries to approximate a sparse structure implied by [2] for vision networks and covering the hypothesized outcome by dense, readily available components.

换句话说就是,Inception model 既可以满足构建稀疏连接的架构,又能够满足卷积在计算机上的密集计算。(全都要)

2. Architecture

Inception架构的主要思想是找出卷积视觉网络中的最佳局部稀疏结构,并近似由现成的密集组件替代。
所以提出了一种更wider的网络架构Inception module


图 2-1 the naive version
该处选用 `1x1` `3x3` `5x5`卷积核的原因是便于对齐。(每一种卷积核卷积之后会产生不同尺寸的输出,为了将所有通道数叠起来,需要保证长宽一致。 )此外由于各大经典网络结构已经证明了pooling 层的重要性,所有该处也增加了池化通道。

由于这些Inception module彼此堆叠在一起,他们的输出相关性统计数据必然也会有所不同:随着更高抽象的特征被高层捕捉,他们的空间集中度预计将会降低,这表明3x3.5x5卷积的比率应该随着层数的增加而增加。

As these “Inception modules” are stacked on top of each other, their output correlation statistics are bound to vary: as features of higher abstraction are captured by higher layers, their spatial concentration is expected to decrease suggesting that the ratio of 3×3 and 5×5 convolutions should increase as we move to higher layers.

最初的模型有一个问题就是:即使是 5×5 卷积也会导致在计算方面需要大量资源。一旦添加池化,这个问题就会更多地出现。

解决办法就是:明智地运用维度缩减和投影。

This leads to the second idea of the proposed architecture: judiciously applying dimension reductions and projections wherever the computational requirements would increase too much otherwise.

为了解决这种问题,在3x3,5x5卷积的前面添加了1x1卷积。模型结构改进后如图 2-2


图 2-2 Inception module with dimension reductions
参数减少说明: > https://medium.com/analytics-vidhya/paper-explanation-going-deeper-with-convolutions-googlenet-the-ai-blog-b79574ac8fe0

Inception网络就由上述类型的模块堆叠而成,偶尔会加入最大池化层,步幅为2。
而且由于设备处理效率低下,最好是将Inception module放在网络的higher layer,前面由传统的卷积神经网络替代。

Inception module的优点:允许显著增加每个阶段的单元数量,而不会产生参数爆炸的问题。并且由于是多卷积堆叠,抽取的特征是来自不同的尺度。

3. GoogLeNet

该名字是为了致敬 LeNet。
GoogLeNet 由 22 层深度网络(包括池化层的 27 层)组成。所有的卷积,包括 inception 模块内部的卷积,都使用ReLU激活函数。


图 3-1 GoogLeNet 配置图

GoogLeNet 是一个 22 层的深度,只计算带有参数的层。使用如此深的网络,可能会出现诸如梯度消失之类的问题。为了消除这种情况,作者引入了连接到中间层的辅助分类器,并帮助梯度信号向后传播。这些辅助分类器添加在Inception (4a) 和 (4d)模块的输出之上。辅助分类器的损失在训练期间被添加并在推理期间被丢弃。
边上额外网络的确切结构,包括辅助分类器,配置如下:


图 3-2 辅助分类器配置
网络的整体结构如图 3-3

图 3-3 GoogLeNet
---

4. 代码实现

import torchimport torch.nn as nnclass Inception(nn.Module):def __init__(self, input_channels, n1x1, n3x3_reduce, n3x3, n5x5_reduce, n5x5, pool_proj):super().__init__()#1x1conv branchself.b1 = nn.Sequential(nn.Conv2d(input_channels, n1x1, kernel_size=1),nn.BatchNorm2d(n1x1),nn.ReLU(inplace=True))#1x1conv -> 3x3conv branchself.b2 = nn.Sequential(nn.Conv2d(input_channels, n3x3_reduce, kernel_size=1),nn.BatchNorm2d(n3x3_reduce),nn.ReLU(inplace=True),nn.Conv2d(n3x3_reduce, n3x3, kernel_size=3, padding=1),nn.BatchNorm2d(n3x3),nn.ReLU(inplace=True))#1x1conv -> 5x5conv branch#we use 2 3x3 conv filters stacked instead#of 1 5x5 filters to obtain the same receptive#field with fewer parametersself.b3 = nn.Sequential(nn.Conv2d(input_channels, n5x5_reduce, kernel_size=1),nn.BatchNorm2d(n5x5_reduce),nn.ReLU(inplace=True),nn.Conv2d(n5x5_reduce, n5x5, kernel_size=3, padding=1),nn.BatchNorm2d(n5x5, n5x5),nn.ReLU(inplace=True),nn.Conv2d(n5x5, n5x5, kernel_size=3, padding=1),nn.BatchNorm2d(n5x5),nn.ReLU(inplace=True))#3x3pooling -> 1x1conv#same convself.b4 = nn.Sequential(nn.MaxPool2d(3, stride=1, padding=1),nn.Conv2d(input_channels, pool_proj, kernel_size=1),nn.BatchNorm2d(pool_proj),nn.ReLU(inplace=True))def forward(self, x):return torch.cat([self.b1(x), self.b2(x), self.b3(x), self.b4(x)], dim=1)class GoogleNet(nn.Module):def __init__(self, num_class=100):super().__init__()self.prelayer = nn.Sequential(nn.Conv2d(3, 64, kernel_size=3, padding=1, bias=False),nn.BatchNorm2d(64),nn.ReLU(inplace=True),nn.Conv2d(64, 64, kernel_size=3, padding=1, bias=False),nn.BatchNorm2d(64),nn.ReLU(inplace=True),nn.Conv2d(64, 192, kernel_size=3, padding=1, bias=False),nn.BatchNorm2d(192),nn.ReLU(inplace=True),)#although we only use 1 conv layer as prelayer,#we still use name a3, b3.......self.a3 = Inception(192, 64, 96, 128, 16, 32, 32)self.b3 = Inception(256, 128, 128, 192, 32, 96, 64)##"""In general, an Inception network is a network consisting of##modules of the above type stacked upon each other, with occasional##max-pooling layers with stride 2 to halve the resolution of the##grid"""self.maxpool = nn.MaxPool2d(3, stride=2, padding=1)self.a4 = Inception(480, 192, 96, 208, 16, 48, 64)self.b4 = Inception(512, 160, 112, 224, 24, 64, 64)self.c4 = Inception(512, 128, 128, 256, 24, 64, 64)self.d4 = Inception(512, 112, 144, 288, 32, 64, 64)self.e4 = Inception(528, 256, 160, 320, 32, 128, 128)self.a5 = Inception(832, 256, 160, 320, 32, 128, 128)self.b5 = Inception(832, 384, 192, 384, 48, 128, 128)#input feature size: 8*8*1024self.avgpool = nn.AdaptiveAvgPool2d((1, 1))self.dropout = nn.Dropout2d(p=0.4)self.linear = nn.Linear(1024, num_class)def forward(self, x):x = self.prelayer(x)x = self.maxpool(x)x = self.a3(x)x = self.b3(x)x = self.maxpool(x)x = self.a4(x)x = self.b4(x)x = self.c4(x)x = self.d4(x)x = self.e4(x)x = self.maxpool(x)x = self.a5(x)x = self.b5(x)#"""It was found that a move from fully connected layers to#average pooling improved the top-1 accuracy by about 0.6%,#however the use of dropout remained essential even after#removing the fully connected layers."""x = self.avgpool(x)x = self.dropout(x)x = x.view(x.size()[0], -1)x = self.linear(x)return x


5. 总结

为了能够将稀疏性和计算的密集性结合起来,拓宽了网络结构。并且采用了1x1,3x3,5x5的小卷积形式。并且加入了1x1卷积层降低维度。在防止梯度消失时加入了辅助分类器。

参考

https://medium.com/analytics-vidhya/paper-explanation-going-deeper-with-convolutions-googlenet-the-ai-blog-b79574ac8fe0 # Paper Explanation: Going deeper with Convolutions (GoogLeNet)
https://towardsdatascience.com/deep-learning-googlenet-explained-de8861c82765 # Deep Learning: GoogLeNet Explained
https://machinelearningmastery.com/batch-normalization-for-training-of-deep-neural-networks/ # A Gentle Introduction to Batch Normalization for Deep Neural Networks
https://github.nowall.world/weiaicunzai/pytorch-cifar100 # 代码实现

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

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

相关文章

UNIAPP----video标签层级问题的三种解决方法

uniapp的app端,video标签层级过高,无法轻易被遮盖。 三种解决方法,真机测试没问题。代码复制即可。 1.cover-view或者cover-image,放在video标签内使用,子绝父相 缺点:只能改变cover-view样式&#xff0…

算法落地思考:如何让智能运维更智能

嘉宾 | 王鹏 整理人 | 西狩xs 出品 | CSDN云原生 AIOps是人工智能与运维的结合,能够基于已有的运维数据,利用人工智能算法,通过机器学习的方式帮助企业提升运维效率,解决自动化运维无法管理的问题。 2022年8月30日&#xff0…

spring底层原理初探

一,spring原理初探 1,bean的创建生命周期 userService.class --> 推断构造方法 --> 实例化对象 --> 依赖注入(属性填充) --> 初始化前(PostConstruct) --> 初始化 (Initializingbean) --> 初始化后(AOP,bean的后置处理器…

Wireshark分析https流量

这里写自定义目录标题本文介绍使用wireshark分析https流量的方法。适用chromium内核的浏览器和firefox浏览器,前提是这些浏览器内核都支持如下选项: –ssl-key-log-file 浏览器配置 添加启动参数 例如: firefox.exe --ssl-key-log-filec:/s…

Python中setdefault()通过键查找字典中对应的值

【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 字典中根据键k查找键k对应的值v 如果没找到键k,则创建键k并赋值为default setdefault() [太阳]选择题 以下Python代码中setdefault(d, 666)的返回值是什么? myDic {&…

java基于微信小程序的大学生个人家庭理财产品 uniapp小程序

为了方便操作,从多方面把用户的个人支付,个人收入等财产管理的数据,以及他们的生活结余和消费统计,用科学统计的方法把这些数据存储在财务管理软件之中。文中着重论述了该系统的功能与实现,如数据流程与存储、管理等功能,并对关键的技术作了较详…

动态规划 - 背包问题 回文串分割

目录 1.背包问题 1.1 题目描述 1.2 画图分析 1.3 思路分析 1.4 代码示例 2. 回文串分割 2.1 题目描述 2.2 思路分析 2.3 代码示例 1.背包问题 1.1 题目描述 有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小 和数组 V 表示每个物品的价值.问最多能装…

ROS+Arduino学习导航贴

前言 原先写了一些ROSarduino学习记录的帖子,发现每次找起来非常麻烦,所以做一个汇总帖,以后需要的话,找起来就方便了。 关于我用的开发板,一开始学习的时候,我用的开发板是arduino uno这类的&#xff0c…

[笔记]MySQL 插入导致死锁

线上遇到的 MySQL 插入导致死锁,问题排查. 场景复现 MySQL 版本: 5.7.36 数据库存储引擎: InnoDB 事务隔离级别: REPEATABLE-READ 1. 创建测试表 DROP TABLE IF EXISTS tb_task; CREATE TABLE tb_task (id int(11) NOT NULL AUTO_INCREMENT,task_id int(11),order_id int(1…

猿创征文 |【数据结构】2个例题带你理解图的遍历:广度优先搜索

目录 1、定义 2、算法分析 3、算法实现 4、性能分析 💟作者简介:大家好呀!我是路遥叶子,大家可以叫我叶子哦!❣️ 📝个人主页:【叶子博客】 🏆博主信息:四季轮换…

jquery实现云音乐歌词高亮和自动滚动效果

书接上篇文章 实现效果: 一、歌词高亮 首先要判断当前歌词和播放器的当前时间 循环歌词数组treatLyrics,拿到每条歌词的时间与播放器的当前时间playAudio.currentTime进行比较 treatLyrics.forEach((i, index) > { // console.log(i); // console.…

目前最好用的NAS系统是什么?

NAS被定义为一种特殊的专用数据存储服务器,包括存储器件(例如磁盘阵列、CD/DVD驱动器、磁带驱动器或可移动的存储介质)和内嵌系统软件,那么目前最好用的nas系统是什么? 常见的NAS系统有哪些 Nas 系统一般都是基于 Li…

Uplink Resource Allocation in IEEE 802.11ax

一、基本信息 题目:IEEE 802.11ax中的上行链路资源分配 作者:Sudeep Bhattarai, Gaurang Naik, Jung-Min (Jerry) Park 摘要:MU-OFDMA使得多个用户可以在更小的子信道(即资源单元,RUs)中同时进行传输,从而提高802.11ax…

如何从零开始解读产品经理行业分析

上次一起了解了什么是产品经理,产品经理PM和PD在不同类型公司的作用。了解产品经理对当前的应用产品中的重要作用。是不是有点憧憬,其实憧憬是美好的,但是还是要走进现实具体怎么去做,一步一步脚踏实地的,一步一步走入…

【Linux入门】— 腾讯云服务器的搭建

꧁ 各位大佬们好!很荣幸能够得到您的访问,让我们一起在编程道路上任重道远!꧂ ☙ 博客专栏:【Linux知识】❧ ⛅ 本篇内容简介:Linux小白到精通 — 学好Linux从学会服务器搭建开始! ⭐ 了解作者&#xff1…

Java操作Zookeeper框架

Zookeeper框架 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hb…

Java Double equals()方法具有什么功能呢?

转自: Java Double equals()方法具有什么功能呢? 下文笔者将讲述equals()方法的功能简介说明,如下所示: equals()方法的功能 java.lang.Double.equals()方法的功能: 将当前的Double对象同一个对象进行比较, 当Object是一个Double对象&…

【牛客 - 剑指offer】JZ8 二叉树的下一个结点 Java实现

文章目录剑指offer题解汇总 Java实现本题链接题目方案一 中序遍历递归代码一 设置flag标记代码二 获取整个arrayList的大小方案二 分类直接寻找(分情况讨论)思路代码(版本一)代码(版本二)剑指offer题解汇总…

计算机毕业设计成品java项目开发实例SSM+MySQL实现的家庭医生预约平台

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 一、项目介绍 二、项目截图 三、项目获取 一、项目介绍 java毕业设计计算机毕设项目之基于SSMMySQL实现的家庭医生预约平台_哔哩哔哩_bilibilijava毕业设计计算机毕设项目之基于SSMMyS…

记首次协助搭建服务器

一,服务器资源申请 1)使用云服务器(k8s)还是IDC服务器 云服务器VS IDC服务器 不同: 费用一样,云服务器支持动态扩容 私有云和IDC没有很大区别,只是私有云支持k8s,动态扩容方便。…