TensorFlow深度学习之卷积神经网络CNN


Posted in Python onMarch 09, 2018

一、卷积神经网络的概述

卷积神经网络(ConvolutionalNeural Network,CNN)最初是为解决图像识别等问题设计的,CNN现在的应用已经不限于图像和视频,也可用于时间序列信号,比如音频信号和文本数据等。CNN作为一个深度学习架构被提出的最初诉求是降低对图像数据预处理的要求,避免复杂的特征工程。在卷积神经网络中,第一个卷积层会直接接受图像像素级的输入,每一层卷积(滤波器)都会提取数据中最有效的特征,这种方法可以提取到图像中最基础的特征,而后再进行组合和抽象形成更高阶的特征,因此CNN在理论上具有对图像缩放、平移和旋转的不变性。

卷积神经网络CNN的要点就是局部连接(LocalConnection)、权值共享(Weights Sharing)和池化层(Pooling)中的降采样(Down-Sampling)。其中,局部连接和权值共享降低了参数量,使训练复杂度大大下降并减轻了过拟合。同时权值共享还赋予了卷积网络对平移的容忍性,池化层降采样则进一步降低了输出参数量并赋予模型对轻度形变的容忍性,提高了模型的泛化能力。可以把卷积层卷积操作理解为用少量参数在图像的多个位置上提取相似特征的过程。

卷积层的空间排列:上文讲解了卷积层中每个神经元与输入数据体之间的连接方式,但是尚未讨论输出数据体中神经元的数量,以及它们的排列方式。3个超参数控制着输出数据体的尺寸:深度(depth),步长(stride)和零填充(zero-padding)。首先,输出数据体的深度是一个超参数:它和使用的滤波器的数量一致,而每个滤波器在输入数据中寻找一些不同的东西。其次,在滑动滤波器的时候,必须指定步长。有时候将输入数据体用0在边缘处进行填充是很方便的。这个零填充(zero-padding)的尺寸是一个超参数。零填充有一个良好性质,即可以控制输出数据体的空间尺寸(最常用的是用来保持输入数据体在空间上的尺寸,这样输入和输出的宽高都相等)。输出数据体在空间上的尺寸可以通过输入数据体尺寸(W),卷积层中神经元的感受野尺寸(F),步长(S)和零填充的数量(P)的函数来计算。(这里假设输入数组的空间形状是正方形,即高度和宽度相等)输出数据体的空间尺寸为(W-F +2P)/S+1,在计算上,输入数据体的长和宽按照该公式计算,深度依赖于滤波器的数量。步长的限制:注意这些空间排列的超参数之间是相互限制的。举例说来,当输入尺寸W=10,不使用零填充则P=0,滤波器尺寸F=3,这样步长S=2就行不通,结果4.5不是整数,这就是说神经元不能整齐对称地滑过输入数据体。

汇聚层使用MAX操作,对输入数据体的每一个深度切片独立进行操作,改变它的空间尺寸。最常见的形式是汇聚层使用尺寸2x2的滤波器,以步长为2来对每个深度切片进行降采样,将其中75%的激活信息都丢掉。每个MAX操作是从4个数字中取最大值(也就是在深度切片中某个2x2的区域)。深度保持不变。

二、卷积神经网络的结构

卷积神经网络通常是由三种层构成:卷积层,汇聚层(除非特别说明,一般就是最大值汇聚)和全连接层(fully-connected简称FC)。ReLU激活函数也应该算是是一层,它逐元素地进行激活函数操作。

TensorFlow深度学习之卷积神经网络CNN

卷积神经网络最常见的形式就是将一些卷积层和ReLU层放在一起,其后紧跟汇聚层,然后重复如此直到图像在空间上被缩小到一个足够小的尺寸,在某个地方过渡成成全连接层也较为常见。最后的全连接层得到输出,比如分类评分等。

最常见的卷积神经网络结构如下:

INPUT -> [[CONV -> RELU]*N ->POOL?]*M -> [FC -> RELU]*K -> FC

其中*指的是重复次数,POOL?指的是一个可选的汇聚层。其中N >=0,通常N<=3,M>=0,K>=0,通常K<3。

几个小滤波器卷积层的组合比一个大滤波器卷积层好。直观说来,最好选择带有小滤波器的卷积层组合,而不是用一个带有大的滤波器的卷积层。前者可以表达出输入数据中更多个强力特征,使用的参数也更少。唯一的不足是,在进行反向传播时,中间的卷积层可能会导致占用更多的内存。

输入层(包含图像的)应该能被2整除很多次。常用数字包括32(比如CIFAR-10),64,96(比如STL-10)或224(比如ImageNet卷积神经网络),384和512。

卷积层应该使用小尺寸滤波器(比如3x3或最多5x5),使用步长S=1。还有一点非常重要,就是对输入数据进行零填充,这样卷积层就不会改变输入数据在空间维度上的尺寸。一般对于任意F,当P=(F-1)/2的时候能保持输入尺寸。如果必须使用更大的滤波器尺寸(比如7x7之类),通常只用在第一个面对原始图像的卷积层上。

汇聚层负责对输入数据的空间维度进行降采样,提升了模型的畸变容忍能力。最常用的设置是用用2x2感受野的最大值汇聚,步长为2。注意这一操作将会把输入数据中75%的激活数据丢弃(因为对宽度和高度都进行了2的降采样)。另一个不那么常用的设置是使用3x3的感受野,步长为2。最大值汇聚的感受野尺寸很少有超过3的,因为汇聚操作过于激烈,易造成数据信息丢失,这通常会导致算法性能变差。

TensorFlow深度学习之卷积神经网络CNN

三、CNN最大的特点在于卷积的权值共享(参数共享),可以大幅度减少神经网络的参数数量,防止过拟合的同时又降低了神经网络模型的复杂度。如何理解?

假设输入图像尺寸是1000*1000并且假定是灰度图像,即只有一个颜色通道。那么一张图片就有100万个像素点,输入维度就是100万。如果采用全连接层(Fully Connected Layer,FCL)的话,隐含层与输入层相同大小(100万个隐含层节点),那么将产生100万*100万=1万亿个连接,仅此就有1万亿个参数需要去训练,这是不可想象的。考虑到人的视觉感受野的概念,每一个感受野只接受一小块区域的信号,每一个神经元不需要接收全部像素点的信息,只需要接收局部像素点作为输入,而将所有这些神经元接收的局部信息综合起来就可以得到全局的信息。于是将之前的全连接模式修改为局部连接,假设局部感受野大小是10*10,即每个隐含节点只与10*10个像素点相连,那么现在只需要10*10*100万=1亿个连接了,相比之前的1万亿已经缩小了10000倍。假设我们的局部连接方式是卷积操作,即默认每一个隐含节点的参数都完全一样,那么我们的参数将会是10*10=100个。不论图像尺寸有多大,都是这100个参数,即卷积核的尺寸,这就是卷积对减小参数量的贡献。这也就是所谓的权值共享。我们采取增加卷积核的数量来多提取一些特征,每一个卷积核滤波得到的图像就是一类特征的映射,即一个Feature Map。一般来说,我们使用100个卷积核在第一个卷积层就足够了,这样我们有100*100=10000个参数相比之前的1亿又缩小了10000倍。卷积的好处是,不管图片尺寸如何,需要训练的参数数量只跟卷积核大小和数量有关,并且需要注意的是,尽管参数的数量大大下降了,但是我们的隐含节点的数量并没有下降,隐含节点的数量只跟卷积的步长有关系。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python写的PHPMyAdmin暴力破解工具代码
Aug 06 Python
在Python中使用zlib模块进行数据压缩的教程
Jun 26 Python
详解Python 数据库 (sqlite3)应用
Dec 07 Python
使用Python &amp; Flask 实现RESTful Web API的实例
Sep 19 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
Python实现高斯函数的三维显示方法
Dec 29 Python
python仿抖音表白神器
Apr 08 Python
numpy.where() 用法详解
May 27 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
Jun 03 Python
Python实现删除某列中含有空值的行的示例代码
Jul 20 Python
Python实现自动签到脚本的示例代码
Aug 19 Python
python中tkinter复选框使用操作
Nov 11 Python
TensorFlow实现卷积神经网络CNN
Mar 09 #Python
新手常见6种的python报错及解决方法
Mar 09 #Python
Python 函数基础知识汇总
Mar 09 #Python
Python 使用with上下文实现计时功能
Mar 09 #Python
TensorFlow搭建神经网络最佳实践
Mar 09 #Python
TensorFlow实现Batch Normalization
Mar 08 #Python
用Django实现一个可运行的区块链应用
Mar 08 #Python
You might like
zend Framework中的Layout(模块化得布局)详解
2013/06/28 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
php中文语义分析实现方法示例
2019/09/28 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
js编码、解码函数介绍及其使用示例
2013/09/05 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
2016/02/15 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
javascript中的面向对象
2017/03/30 Javascript
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
JS控制只能输入数字并且最多允许小数点两位
2019/11/24 Javascript
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
python比较两个列表大小的方法
2015/07/11 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
我就是这样学习Python中的列表
2019/06/02 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
Python 爬虫的原理
2020/07/30 Python
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
学校后勤岗位职责
2014/02/19 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
七夕情人节问候语
2015/11/11 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书