Inception Network

news2024/11/18 17:20:26

文章目录

  • 一、Inception Network简介
  • 二、CNN的痛点
  • 三、Inception Network
    • 1. 1x1卷积核
      • 1.1 升维/降维:
      • 1.2. 调节参数数量:
      • 1.3. 增加非线性特性:
    • 2. Inception原始模型
    • 3. Inception Module
    • 4. Inception Network
  • 四、代码示例

一、Inception Network简介

  Inception Network又称GoogleNet,是2014年Christian Szegedy提出的一种全新的深度学习结构,并在当年的ILSVRC比赛中获得第一名的成绩。相比于传统CNN模型通过不断增加神经网络的深度来提升训练表现,Inception Network另辟蹊径,通过Inception model的设计和运用,在有限的网络深度下,大大提高了模型的训练速度(即减少了训练参数)和准确率,是一个CNN历史上里程碑式的进步。

二、CNN的痛点

  在Inception Network出现之前,很多CNN模型(如VGG等)在图像识别上都取得了令人惊叹的成果,但是他们都面临着共同的痛点:
  1. 由于模型深度过大,导致计算量飙升,对算力的需求近乎无限增加;
  2. 过深的神经网络容易产生过拟合;
  3. 由于图像信息的多样性,合适的卷积核大小的选择变得更加困难(不同大小的卷积核感受野不同,提取的图像信息侧重点不同);
  为了解决以上问题,Inception Network的设计者对“过滤器使用固定大小卷积核”提出了质疑,并给出“要更宽,而不是更深(wider rather than deeper)”的思路(即过滤器使用多个大小不同的卷积核),为CNN的设计提供了一种更好的方案。

三、Inception Network

1. 1x1卷积核

  1x1卷积核是CNN网络中常见的组成部分,它的主要作用有如下三点:

1.1 升维/降维:

  1x1的卷积核由于大小只有1x1,所以并不需要考虑像素跟周边像素的关系,它主要用于调节通道数,对不同的通道上的像素点进行线性组合,然后进行非线性化计算,可以完成升维和降维的功能,如下图所示,输入的WHD特征图矩阵与1个1x1大小的卷积核卷积后,输出的特征图的深度(通道数)将会从D变成1,从而实现了降维的作用。而升维只需要增加卷积核的数量即可,原理相同。
单个1*1卷积核的降维

1.2. 调节参数数量:

  前面所说的降维,其实也是减少了参数,因为特征图的通道数小了,参数也自然跟着就减少,相当于在特征图的通道数上进行卷积,压缩特征图,二次提取特征,使得新特征图的特征表达更佳。
&esmp;&esmp;如下图,28x28x192的输入特征图,与32个5x5的卷积核做卷积计算,产生24x24x32的输出,此过程涉及的计算量为28x28x32x(5x5x192)=120.422 million ops。
在这里插入图片描述
  而经过1x1卷积核降维后,整个过程分成了两步,第一步的计算量是28x28x16x(1x1x192)=2.4 million ops。第二部的计算量是28x28x32x(5x5x16)=10 million ops。
合计12.4 million ops。可见经过1x1卷积核降维后,神经网络的计算量大大降低,即需要训练的参数量大幅度减少(同时一定程度上减少了过拟合)。
在这里插入图片描述

1.3. 增加非线性特性:

  使用1x1卷积核的网络更深,而每一层网络后都会用Relu激活函数做计算,这样就增加了一层非线性特征。

2. Inception原始模型

  为了验证“wider rather than deeper”的理论,Inception network的作者设计了如下Inception原始模型。
  我们都知道不同大小的卷积核具有不同的感受野,在输入特征图上用 3 个不同的卷积核(1x1,3x3,5x5)实施卷积操作,相当于同时提取了不同的尺度的特征,冗余信息更少,训练效率更高。最后执行了最大池化操作(max pooling),被连接(concatenated)后,送往下一层 inception 模块。
在这里插入图片描述

3. Inception Module

  然而在Inception原始模型中,由于3x3和5x5的卷积核涉及的参数量过大,计算代价过于昂贵,作者便充分利用了1x1卷积核的特性,在过大的卷积核之前增加1x1卷积核,大幅减少了参数数量,提高了训练效率,这就是Inception Module,如下图。
在这里插入图片描述

4. Inception Network

  利用上述Inception module,一个22层的神经网络被构建完成,如下图,这就是Inception Network V1。
在这里插入图片描述
  Inception Network线性堆叠了 9 个Inception Module,它有 22 层深(如果包括池化层,则为 27 层),在最后它使用了全局平均池化操作。
  注意这里除了Inception Module外,还多了几个分支。所以这些分支有什么用呢?在网络的最后几层,通常是全连接层然后softmax来做出预测。图中分支就是通过隐藏层来做出预测,所以其实是一个softmax输出,它确保了即便是隐藏单元和中间层也参与了特征计算和图片分类,起到一种调整的效果并且防止网络发生过拟合。

四、代码示例

  下面是基于Inception V3的transfer learning模型构建代码:

# 下载已训练好的模型weights
weights_url = "https://storage.googleapis.com/mledu-datasets/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5"
weights_file = "inception_v3.h5"
urllib.request.urlretrieve(weights_url, weights_file)

# 加载InceptionV3 from tensorflow.keras.applications.inception_v3 import InceptionV3
# 其中include_top表示顶部Flatten和Dense层,FALSE为不加载这部分
pre_trained_model = InceptionV3(input_shape=(150, 150, 3),
                                include_top=False,
                                weights=None)

# 加载weights
pre_trained_model.load_weights(weights_file)

# 冻结所有layers
for layer in pre_trained_model.layers:
    layer.trainable = False

# pre_trained_model.summary()

last_layer = pre_trained_model.get_layer('mixed7')
last_output = last_layer.output

# 将Inception的输出传入自定义的layer,用于处理自定义的分类
x = layers.Flatten()(last_output)
x = layers.Dense(1024, activation='relu')(x)
# 二分类
x = layers.Dense(1, activation='sigmoid')(x)

# 模型定义
model = Model(pre_trained_model.input, x)
# 编译
model.compile(optimizer=RMSprop(lr=0.0001),
              loss='binary_crossentropy',
              metrics=['acc'])

# 训练
history = model.fit(
            train_generator,
            validation_data=validation_generator,
            epochs=2,
            verbose=1)

  注:Keras的ImageDataGenerator提供了强大的图片处理能力,用法如下:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

TRAINING_DIR = "/tmp/cats-v-dogs/training/"
train_datagen = ImageDataGenerator(rescale=1./255,
      rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')
train_generator = train_datagen.flow_from_directory(TRAINING_DIR,
                                                    batch_size=100,
                                                    class_mode='binary',
                                                    target_size=(150, 150))

VALIDATION_DIR = "/tmp/cats-v-dogs/testing/"
validation_datagen = ImageDataGenerator(rescale=1./255)
validation_generator = validation_datagen.flow_from_directory(VALIDATION_DIR,
                                                              batch_size=100,
                                                              class_mode='binary',
                                                              target_size=(150, 150))

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

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

相关文章

接口自动化测试 vs. UI自动化测试:为什么前者更快,更省力,更稳定?

从入门到精通!企业级接口自动化测试实战,详细教学!(自学必备视频) 目录 前言: 一、什么是接口自动化测试和 UI 自动化测试 二、为什么接口自动化测试效率比 UI 自动化测试高 1.执行速度 2.维护成本 3.…

AI人工智能与机器人的探索和应用1.1

文章来源于:https://mp.weixin.qq.com/s/fqivYVdakVKG-zDVfD4Qzg 研究机器人和人工智能的技术已有多年了,想来想去,觉得还是有必要对过往的技术做一些凝练和总结。在此过程中,除了能够将知识系统化,构建自己的知识体系…

三次输错密码后,系统是怎么做到不让我继续尝试的?

故事背景 忘记密码这件事,相信绝大多数人都遇到过,输一次错一次,错到几次以上,就不允许你继续尝试了。 但当你尝试重置密码,又发现新密码不能和原密码重复: 相信此刻心情只能用一张图形容: 虽…

python二次加工标准类型 | 包装与授权

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

洽洽离年轻人更近了,陈先保离百亿KPI呢?

文|螳螂观察 作者|图霖 留给陈先保实现百亿营收的时间不多了。 过去几年,洽洽凭借着在产品端、市场端、供应端的绝对实力,守住了休闲零食行业龙头的地位。但最新发布的2023年第一季度业绩报告,却出现了6年来首次营收、净利双双下降。 报告…

Excel大数据量单元格快速填充

个人简介:一个从会计转行数据分析师的三旬老汉 擅长领域:数据分析、数据仓库、大数据 博客内容:平时会将自己工作中遇到的问题进行归纳总结,分享给各位小伙伴,意在帮助大家少加班、不掉发,让我们相互学习&a…

const/static修饰成员函数+初始化列表

一、const修饰成员函数 首先,我们知道,所有的成员函数(除static修饰的),编译器都会隐式传递一个this指针。 它的默认类型为 Type* const this,即this指针只能指向最左边的第一个传入的对象。 const修饰成…

Docker容器体系结构及特点

Docker容器体系结构及特点 Docker是一个应用容器引擎,通过Docker,管理员可以非常方便地对容器进行管理。Docker基于Go语言开发,并且遵从Apache 2.0开源协议。 Docker提供了对容器镜像的打包封装功能。利用Docker,开发者可以将他…

2023 最新版IntelliJ IDEA 2023.1创建Java Web 项目详细步骤(图文详解)

文章目录 🧭 版本情况JavaIDEATomcatmaven 🌏 创建步骤🚗 1、依次点击File >> New >> Project🚓 2、选择New Project 输入自己的项目名,选择JDK版本,而后点击create进行创建🚕 3、鼠…

开新能源汽车有充电焦虑吗?2022年国内充电桩数量已达521万台

哈喽大家好,新能源汽车的不断普及使充电桩市场快速发展起来,同时充电桩的技术正在不断改进,包括充电速度、安全性、互联网功能等多个方面。相比与日渐壮大的新能源汽车用户规模,充电桩的建设相对发展速度较慢,近几年来…

网络编程代码实例:守护进程版

文章目录 前言代码仓库内容目录结构代码结果总结参考资料作者的话 前言 网络编程代码实例:守护进程版。 代码仓库 yezhening/Environment-and-network-programming-examples: 环境和网络编程实例 (github.com)Environment-and-network-programming-examples: 环境…

XShell配置以及使用教程

目录 1、XShell介绍 2、安装XShell 1. 双击运行XShell安装文件,并点击“下一步” 2. 点击“我接受许可证协议中的条款”,点击“下一步” 3. 点击“浏览”更改默认安装路径,点击“下一步” 4. 直接点击“安装” 5. 安装完成&#xff0…

C语言小游戏的实现——三子棋

前言 Hello!友友们,前边我们已经学习了C语言的基础知识,但单纯的理论和简单的代码演示是无法真正做到巩固所学的知识的,那么今天我将会带领大家,根据之前所学的知识,来写一个三子棋小游戏。 目录 前言 总…

从C出发 31 --- 指针专题经典问题剖析

int a 0; int* p &a; //p作为指针指向了a, p 保存的是a 变量的内存地址,// p 这个指针本质是变量,这个变量有没有内存地址?// 有内存地址,为什么?// 因为它作为变量,肯定要占用内存空间的// p 这个变…

第十一章 使用Bind提供域名解析服务

文章目录 第十一章 使用Bind提供域名解析服务一、DNS域名解析服务1、DNS简介2、服务器类型3、13台根DNS服务器的具体信息 二、安装Bind服务程序1、Bind简介2、Bind安装3、关键配置文件4、修改主配置文件5、正向解析实验(1)、编辑区域配置文件&#xff08…

processing官方教程笔记(附加官网链接)更新中~

官方参考文档:https://processing.org/reference 官网视频:https://www.youtube.com/user/shiffman/playlists?view50&sortdd&shelf_id2 b站up主转载官方视频:https://www.bilibili.com/video/BV147411d7kY?p1&vd_source07ce5c…

【计算机三级网络技术】 第六篇 真题练习

文章目录 IPS(入侵防护系统)相关知识点蓝牙服务器技术DNS 服务器WWW 服务器FTP 服务器邮件(Winmail 邮件服务器)生成树协议IEEEVLAN 标识的描述DHCP 服务器 IPS(入侵防护系统)相关知识点 1、入侵防护系统&…

迪赛智慧数——柱状图(象形标识图):在选择另一半时,你更看重的是?

效果图 好看只排第六,第一确实众望所归!当代男女择偶标准出炉,一张图带你看清。 女性挑选另一半时,她们更看重伴侣收入高、职业体面、工作能力强、受教育程度高,还得和自己有共同话题。 男性择偶观和女性恰恰相反&am…

第二届网刃部分WP

第二届网刃部分WP 玩坏的winxp 用VM打开附件时候打不开,后来用DiskGenius软件打开,发现桌面中存在有五张图片 在图片meiren.png中发现有隐藏压缩包 foremost分离文件,发现图片 010查看发现还有一层压缩包,再次分离发现压缩包…

自动售货机程序找零博图程序实现

1、操作界面 2、程序实现 REGION 找零确认 IF #找零确认 THEN //复位 #"50元张数" : 0.0; #"20元张数" : 0.0; #"10元张数" : 0.0; #"5元张数" : 0.0; #"1元张数…