深度学习网络结构之---Inception

目录

一、Inception名称的由来

二、Inception结构

 三、Inception v2

四、Inception v3 

1、深度网络的通用设计原则

2.卷积分解(Factorizing Convolutions)

3.对称卷积分解

3.非对称卷积分解

 五、Inception v4


一、Inception名称的由来

        Inception网络名字来源于《盗梦空间》。inception网络代替人工确定卷积 层中的过滤器类型,解决了计算量爆炸的问题,让网络变得更深。

        基于对AlexNet 的卷积过程的研究,大家逐渐强化了一个信念-----更深的 网络带来更高的准确率,所以最简单,安全,有效地提高准备率的办法就是增加网络 的深度.这也正是Inception名称所隐含的"We need to go deeper"的含义.

        增加网络的深度(往往同时增加每层神经元数量) 容易导致以下几个方面的 问题.

        (1) 导致神经网络参数的数量过多,网络不容易训练,容易出现过拟合,需要更 多的训练数据. 然而训练数据并不容易获得,尤其是需要人工标记样本数据时就更 难了.所以如何在增加网络规模的同时尽可能地减少参数的数量是首先要考虑的 问题.

        (2 )增大了网络的规模(更深,更宽) , 需要消耗大量的计算资源,需要"有 效"和"充分"地使用计算资源.以两个卷积堆叠为例,随着卷积层的过滤器线性增 加,所需要的计算资源与过滤器个数的平方成正比.如果所增加的计算资源没有 被"有效"地使用,如所有的权重于0(但不等于0),那么这些计算量不会带来准确率 的提高,

        (3)当网络的深度达到一定程度之后,浅层神经网络容易出现梯度弥散的问题, 这是因为,误差反向传播的时候,随着深度的增加梯度会迅速变小,从而导致权重参 数变化缓慢,模型无法收敛.

        Inception 的网络架构正是沿着如何解决以上几个问题的方向,有针对性地设 计网络架构的.

二、Inception结构

        Inception就是将多个卷积或池化操作放在一起组装成一个网络模块,设计 神经网络时,以模块为单位去组装整个网络结构。Inception结构设计了一个稀 疏网络结构,但是能够产生稠密的数据,既能增加神经网络表现,又能保证计 算资源的使用效率。

        假设input feature map的size为28 × 28 × 256 ,output feature map的 size为28 × 28 × 480 则native Inception Module的计算量有854M。计算过程 如下  

        从上图可以看出,计算量主要来自高维卷积核的卷积操作,因而在每一个 卷积前先使用1 × 1卷积核将输入图片的feature map维度先降低,进行信息压 缩,在使用3x3卷积核进行特征提取运算,相同情况下,Inception v1的计算量 仅为358M。  

        Inception v1结构总共有4个分支,输入的feature map并行的通过这四个 分支得到四个输出,然后在在将这四个输出在深度维度(channel维度)进行拼 接(concate)得到我们的最终输出(注意,为了让四个分支的输出能够在深度方 向进行拼接,必须保证四个分支输出的特征矩阵高度和宽度都相同),因此 inception结构的参数为:

branch1:Conv1×1 , stride=1
branch2:Conv3×3, stride=1, padding=1
branch3:Conv5×5, stride=1, padding=2
branch4:MaxPool3×3, stride=1, padding=1

        一个完整的Inception模块如图所示。

 

        通过将这些模块组合起来就得到了完整的inception网络,由于它是由 google的研究员提出的,所以也叫做goolenet,是为了向lenet致敬。  

inception网络:

        Inception网络就是将多个Inception模块连接成一个网络。

         网络的最后几层通常为全连接层,最后接一个softmax层。可以看到网络中 的隐藏层有很多分支。这些分支使得隐藏层也可以单独进行预测,降低了过拟 合的风险。

代码实现:

 

#需求:inception,cifar10 确定框架 conv,maxpool flatten ,dense 
dropout ,预处理,bn,激活平均池化,全局平均池化
import tensorflow as tf
from tensorflow.keras.layers import Conv2D, MaxPool2D, 
Flatten, Dense, Dropout, BatchNormalization, Activation, 
AveragePooling2D, GlobalAveragePooling2D
from tensorflow.keras import Model
(x_train,y_train),
(x_test,y_test)=tf.keras.datasets.cifar10.load_data()
x_train=x_train.reshape([-1,32,32,3])/255
x_test=x_test.reshape([-1,32,32,3])/255
class ConvBNRelu(Model):
   def __init__(self, ch, kernelsz=3, strides=1, 
padding='same'):
       super(ConvBNRelu, self).__init__()
       self.model = tf.keras.models.Sequential([
           Conv2D(ch, kernelsz, strides=strides, 
padding=padding),
           BatchNormalization(),
           Activation('relu')
       ])
   def call(self, x):
       x = self.model(x,                       training=False) # 在training=False时,
BN通过整个训练集计算均值、方差去做批归一化,training=True时,通过当前
batch的均值、方差去做批归一化。推理时 training=False效果好
       return x
class InceptionBlk(Model):
   def __init__(self, ch, strides=1):
       super(InceptionBlk, self).__init__()
       self.ch = ch
       self.strides = strides
       self.c1 = ConvBNRelu(ch, kernelsz=1, strides=strides)
       self.c2_1 = ConvBNRelu(ch, kernelsz=1, 
strides=strides)
       self.c2_2 = ConvBNRelu(ch, kernelsz=3, strides=1)
       self.c3_1 = ConvBNRelu(ch, kernelsz=1, 
strides=strides)
       self.c3_2 = ConvBNRelu(ch, kernelsz=5, strides=1)
       self.p4_1 = MaxPool2D(3, strides=1, padding='same')
       self.c4_2 = ConvBNRelu(ch, kernelsz=1, 
strides=strides)
   def call(self, x):
       x1 = self.c1(x)
       x2_1 = self.c2_1(x)
       x2_2 = self.c2_2(x2_1)
       x3_1 = self.c3_1(x)
       x3_2 = self.c3_2(x3_1)
       x4_1 = self.p4_1(x)
       x4_2 = self.c4_2(x4_1)
       # concat along axis=channel
       x = tf.concat([x1, x2_2, x3_2, x4_2], axis=3)
       return x
class Inception10(Model):
   def __init__(self, num_blocks, num_classes, init_ch=16, 
**kwargs):
       super(Inception10, self).__init__(**kwargs)
       self.in_channels = init_ch
       self.out_channels = init_ch
       self.num_blocks = num_blocks
       self.init_ch = init_ch4. Inception v2 
即在v1的基础上于卷积层与激活函数之间插入BN层:Conv-BN-ReLU,并
将v1结构中的5 × 5 卷积核替换为2个3 × 3 卷积核。第二篇论文里,作者给出了
inception v2中卷积分解的详细说明。
       self.c1 = ConvBNRelu(init_ch)
       self.blocks = tf.keras.models.Sequential()
       for block_id in range(num_blocks):
           for layer_id in range(2):
               if layer_id == 0:
                   block = InceptionBlk(self.out_channels, 
strides=2)
               else:
                   block = InceptionBlk(self.out_channels, 
strides=1)
               self.blocks.add(block)
           # enlarger out_channels per block
           self.out_channels *= 2
       self.p1 = GlobalAveragePooling2D()
       self.f1 = Dense(num_classes, activation='softmax')
   def call(self, x):
       x = self.c1(x)
       x = self.blocks(x)
       x = self.p1(x)
       y = self.f1(x)
       return y
model = Inception10(num_blocks=2, num_classes=10)
#模型编译
model.compile(loss=tf.keras.losses.SparseCategoricalCrossentr
opy(),
             optimizer=tf.keras.optimizers.Adam(lr=0.001),
             metrics=['accuracy'])
#one-hot编码
history=model.fit(x_train,y_train,batch_size=64,epochs=1,vali
dation_split=0.3)
score = model.evaluate(x_test, y_test)
print('loss', score[0])
print('accuracy', score[1])

 三、Inception v2

        即在v1的基础上于卷积层与激活函数之间插入BN层:Conv-BN-ReLU,并 将v1结构中的5 × 5 卷积核替换为2个3 × 3 卷积核。第二篇论文里,作者给出了 inception v2中卷积分解的详细说明。

        Batch Normalization

        小卷积核替代大卷积核

        在VGGNet中就提出了通过堆叠两层3 × 3 的卷积核可以替代一层5 × 5 的卷 积核,堆叠三层 3 × 3的卷积核替代一层 7 × 7 的卷积核(参考:VGGNet网络 详解与模型搭建)。这样的连接方式在保持感受野范围的同时又减少了参数 量,并且可以避免表达瓶颈,加深非线性表达能力。基于此,作者通过将 inception v1结构中的5 × 5 卷积核替换为2个3 × 3 卷积核。如下左图为v1结 构,右图为v2结构。

四、Inception v3 

1、深度网络的通用设计原则

        (1) 避免表达瓶颈,特别是在网络靠前的地方。 信息流前向传播过程中显 然不能经过高度压缩的层,即表达瓶颈。从input到 output,feature map的宽和高基本都会逐渐变小,但是不能一下子就变得很小。比如你 上来就来个kernel = 7, stride = 5 ,这样显然不合适。另外输出的维度 channel,一般来说会逐渐增多(每层的num_output),否则网络会很难 训练。(特征维度并不代表信息的多少,只是作为一种估计的手段)。

        (2) 高维特征更易处理。 高维特征更易区分,会加快训练。

        (3)可以在低维嵌入上进行空间汇聚而无需担心丢失很多信息。 比如在进 行3x3卷积之前,可以对输入先进行降维而不会产生严重的后果。假设 信息可以被简单压缩,那么训练就会加快。

       (4)平衡网络的宽度与深度

2.卷积分解(Factorizing Convolutions)

        将一个大卷积核的操作分解成若干个小卷积核的操作称为卷积分 解,并探讨了2种不同的卷积分解方法,即对称卷积分解和不对称卷积 空间分解。

3.对称卷积分解

        即使用小卷积核串联来替代大卷积核,这在inception v2中已经提到过。同时作 者还提出,通过大量实验表明这种替代方案并不会造成表达能力的下降。通过 堆叠两层3 × 3 3\times33×3的卷积核可以替代一层5 × 5 的卷积核,堆叠三层 3 × 3 的卷积核替代一层 7 × 7 的卷积核,可以看出,大卷积核完全可以由一系列 的3 × 3 卷积核来替代,那能不能再分解得更小一点呢?GoogLeNet团队考虑了 非对称卷积分解。

3.非对称卷积分解

        任意n × n 的卷积都可以通过1 × n 卷积后接n × 1卷积来替代,如下图(右)所 示。

 在网络的前期使用这种分解效果并不好,还有在中度大小的feature map 上使用效果才会更好

        降低特征图大小

        一般情况下,如果想让特征图的通道数,可以有如下两种方式:

        先池化再作Inception卷积,或者先作Inception卷积再作池化。但是方法一 (左图)先作pooling(池化)会导致特征表示遇到瓶颈(特征缺失),方法二 (右图)是正常的缩小,但计算量很大。为了同时保持特征表示且降低计算 量,将网络结构改为下图,使用两个并行化的模块来降低计算量(卷积、池化 并行执行,再进行合并),即用卷积得到一半的特征图,池化得到一半的特征 图,再进行拼接。  

 五、Inception v4

        2016年ResNet网络的提出解决了随着神经网络的加深,参数越来越多,模 型越来越难以训练,训练时间大大增加,容易出现梯度消散问题。为了融合这 一重要成果,Inception v4研究了Inception模块与残差连接(Residual Connection)的结合来改进V3结构。

        如图,将残差模块的卷积结构替换为Inception结构,即得到Inception Residual结构。除了上述右图中的结构外,作者通过20个类似的模块进行组 合,最后形成了InceptionV4的网络结构,构建了Inception-ResNet模型.  

总结回顾
Inception v1主要采用了多尺度卷积核、1x1卷积操作。
Inception v2在v1的基础上增加了BN层,使用2个3 × 3小卷积核堆叠替换5 × 
5大卷积核;
inception v3进行了卷积分解(将7 × 7 分解成两个一维的卷积1 × 7 和1 × 
7 ,3 × 3 也是一样1 × 3 和3 × 1 和特征图降维。
inception v4在v3的基础上融合了Residual模块。

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

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

相关文章

推荐一款好用的读论文软件操作方法

步骤: 1. 使用一译 —— 文档和论文翻译、对照阅读、讨论和社区 2.上传自己想要翻译的论文即可。 示例 Planing论文双语翻译 1.1 Parting with Misconceptions about Learning-based Vehicle Motion Planning 中英文对照阅读 1.2 Rethinking Imitation-based Pl…

3.多层感知机

目录 1.感知机训练感知机XOR问题(Minsky&Papert 1969) AI的第一个寒冬总结 2.多层感知机(MLP)学习XOR单隐藏层(全连接层)激活函数:Sigmoid激活函数:Tanh激活函数:ReLu 最常用的 因为计算速度…

AMSR-MODIS 边界层水汽 L3 每日 1 度 x 1 度 V1、V2 版本数据集

AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V1 (AMDBLWV) at GES DISC AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V2 (AMDBLWV) at GES DISC 简介 该数据集可估算均匀云层下的海洋边界层水汽。AMSR-E 和 AMSR-2 的微波…

使用libcurl实现简单的HTTP访问

代码; #include <stdio.h> #include <stdlib.h> #include <curl/curl.h> // 包含libcurl库 FILE *fp; // 定义一个文件标识符 size_t write_data(void *ptr,size_t size,size_t nmemb,void *stream) { // 定义回调函数&#xff0c;用于将…

MGRS坐标

一 概述 MGRS坐标系统&#xff0c;即军事格网参考系统&#xff0c;是北约(NATO)军事组织使用的标准坐标系统。它基于UTM&#xff08;通用横向墨卡托&#xff09;系统&#xff0c;并将每个UTM区域进一步划分为100km100km的小方块。这些方块通过两个相连的字母标识&#xff0c;其…

华为云开发者社区活动-基于MindNLP的ChatGLM-6B聊天机器人体验

MindNLP ChatGLM-6B StreamChat 本案例基于MindNLP和ChatGLM-6B实现一个聊天应用。支持流式回复。 本活动通过配置环境&#xff0c;模型接入&#xff0c;以及gradio前端界面搭建&#xff0c;实现了聊天机器人的功能。 以下是一些体验记录&#xff1a; 有兴趣的可以通过以下链…

详细解析找不到msvcp120.dll文件的原因及解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到msvcp120.dll”。这个错误提示通常出现在运行某些程序或游戏时&#xff0c;给使用者带来了困扰。那么&#xff0c;究竟是什么原因导致了这个问题的出现&#xff1f;又该如何解决呢&a…

【每日刷题】Day64

【每日刷题】Day64 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCP 67. 装饰树 - 力扣&#xff08;LeetCode&#xff09; 3. 1315. 祖父节点值为偶数的节点和 - 力…

PyQT5 中关于 QCheckBox 的勾选状态的一点小细节

一、QCheckBox 是 PyQt5 中的一个用于创建复选框的控件&#xff0c;以下是其一些常见方法和属性&#xff1a; setChecked: 设置复选框的选中状态。isChecked: 检查复选框是否被选中。text: 设置或获取复选框的文本。state: 获取复选框的状态&#xff08;无、选中、不可用等&am…

公差基础-配合(互换性和测量基础)-2

过盈配合&#xff1a; 配合的种类&#xff1a; 三种&#xff1a;间隙&#xff0c;过渡&#xff0c;过盈配 间隙配合&#xff1a; 过盈配合&#xff1a; 过渡配合&#xff1a; 间隙量&#xff1a;最大间隙减去最小间隙&#xff1b; 配合的公差怎么算&#xff1a; 练习&#xff…

Git 代码管理规范 !

分支命名 master 分支 master 为主分支&#xff0c;也是用于部署生产环境的分支&#xff0c;需要确保master分支稳定性。master 分支一般由 release 以及 hotfix 分支合并&#xff0c;任何时间都不能直接修改代码。 develop 分支 develop 为开发环境分支&#xff0c;始终保持最…

如何在 Go 应用程序中使用检索增强生成(RAG)

本文将帮助大家实现 RAG &#xff08;使用 LangChain 和 PostgreSQL &#xff09;以提高 LLM 输出的准确性和相关性。 得益于强大的机器学习模型&#xff08;特别是由托管平台/服务通过 API 调用公开的大型语言模型&#xff0c;如 Claude 的 LLama 2等&#xff09;&#xff0c…

创邻科技张晨:期待解锁图技术在供应链中的关联力

近日&#xff0c;创邻科技创始人兼CEO张晨博士受浙江省首席信息官协会邀请&#xff0c;参加数字化转型与企业出海研讨会。 此次研讨会旨在深入探讨数字经济时代下&#xff0c;企业如何有效应对成本提升与环境变化所带来的挑战&#xff0c;通过数字化转型实现提效增益&#xff…

解决 Visual C++ 17.5 __cplusplus 始终为 199711L 的问题

目录 软件环境问题描述查阅资料解决问题参考文献 软件环境 Visual Studio 2022, Visual C, Version 17.5.4 问题描述 在应用 https://github.com/ToniLipponen/cpp-sqlite 的过程中&#xff0c;发现源代码文件 sqlite.hpp 中&#xff0c;有一处宏&#xff0c;和本项目的 C L…

R语言数据分析案例27-使用随机森林模型对家庭资产的回归预测分析

一、研究背景及其意义 家庭资产分析在现代经济学中的重要性不仅限于单个家庭的财务健康状况&#xff0c;它还与整个经济体的发展紧密相关。家庭资产的增长通常反映了国家经济的整体增长&#xff0c;而资产分布的不均则暴露了经济不平等的问题。因此&#xff0c;全球视角下的家…

好像也没那么失望!SD3玩起来,Stable Diffusion 3工作流商业及广告设计(附安装包)

今天基于SD3 base 工作流来尝试进行下广告设计&#xff0c;这要是一配上设计文案&#xff0c;视觉感就出来了。下面来看看一些效果展示~ SD3 Medium模型及ComfyUI工作流下载地址&#xff1a;文末领取&#xff01; 1.清凉夏日——西瓜音乐会 提示词&#xff1a; a guitar wi…

基于springboot实现火锅店管理系统项目【项目源码+论文说明】

基于springboot实现火锅店管理系统演示 摘要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装火锅店管理系统软件来…

LabVIEW软件开发任务的工作量估算方法

在开发LabVIEW软件时&#xff0c;如何准确估算软件开发任务的工作量。通过需求分析、功能分解、复杂度评估和资源配置等步骤&#xff0c;结合常见的估算方法&#xff0c;如专家判断法、类比估算法和参数估算法&#xff0c;确保项目按时按质完成&#xff0c;提供项目管理和资源分…

机器学习笔记 - 用于3D点云数据分类的Point Net的训练

一、数据集 ShapeNet 是一项持续不断的努力,旨在建立一个注释丰富的大型 3D 形状数据集。我们为世界各地的研究人员提供这些数据,以支持计算机图形学、计算机视觉、机器人技术和其他相关学科的研究。ShapeNet 是普林斯顿大学、斯坦福大学和 TTIC 研究人员的合作成果。 Shape…

Vue43-单文件组件

一、脚手架的作用 单文件组件&#xff1a;xxx.vue&#xff0c;浏览器不能直接运行&#xff01;&#xff01;&#xff01; 脚手架去调用webpack等第三方工具。 二、vue文件的命名规则 建议用下面的两种方式。&#xff08;首字母大写&#xff01;&#xff01;&#xff01;&#x…