YJango的卷积神经网络.docx
《YJango的卷积神经网络.docx》由会员分享,可在线阅读,更多相关《YJango的卷积神经网络.docx(37页珍藏版)》请在冰豆网上搜索。
YJango的卷积神经网络
YJango的卷积神经网络——介绍
很久没有更新文章了。
这次就更新一个很久之前就答应要写的卷积神经网络的文章。
PS:
YJango是我的网名,意思是我写的教程,并不是一种网络结构。
。
关于卷积神经网络的讲解,网上有很多精彩文章,且恐怕难以找到比斯坦福的CS231n还要全面的教程。
所以这里对卷积神经网络的讲解主要是以不同的思考侧重展开,通过对卷积神经网络的分析,进一步理解神经网络变体中“因素共享”这一概念。
注意:
该文会跟其他的现有文章有很大的不同。
读该文需要有本书前些章节作为预备知识,不然会有理解障碍。
没看过前面内容的朋友建议看公开课视频:
深层神经网络设计理念。
当中的知识可以更好的帮助理解该文。
gitbook首发阅读地址:
卷积神经网络——介绍,看前先刷新浏览器
如果要提出一个新的神经网络结构,首先就需要引入像循环神经网络中“时间共享”这样的先验知识,降低学习所需要的训练数据需求量。
而卷积神经网络同样也引入了这样的先验知识:
“空间共享”。
下面就让我们以画面识别作为切入点,看看该先验知识是如何被引入到神经网络中的。
|
视觉感知
o画面识别是什么
o识别结果取决于什么
图像表达
o画面识别的输入
o画面不变形
前馈神经网络做画面识别的不足
/
卷积神经网络做画面识别
o局部连接
o空间共享
o输出空间表达
oDepth维的处理
oZeropadding
o形状、概念抓取
o多filters
o非线性
o输出尺寸控制
o…
o矩阵乘法执行卷积
oMaxpooling
o全连接层
o结构发展
画面不变性的满足
o平移不变性
o旋转和视角不变性
o尺寸不变性
oInception的理解
o(
o1x1卷积核理解
o跳层连接ResNet
视觉感知
一、画面识别是什么任务
学习知识的第一步就是明确任务,清楚该知识的输入输出。
卷积神经网络最初是服务于画面识别的,所以我们先来看看画面识别的实质是什么。
先观看几组动物与人类视觉的差异对比图。
1.苍蝇的视觉和人的视觉的差异
(
2.蛇的视觉和人的视觉的差异
(更多对比图请参考链接)
通过上面的两组对比图可以知道,即便是相同的图片经过不同的视觉系统,也会得到不同的感知。
这里引出一条知识:
生物所看到的景象并非世界的原貌,而是长期进化出来的适合自己生存环境的一种感知方式。
蛇的猎物一般是夜间行动,所以它就进化出了一种可以在夜间也能很好观察的感知系统,感热。
任何视觉系统都是将图像反光与脑中所看到的概念进行关联。
(
所以画面识别实际上并非识别这个东西客观上是什么,而是寻找人类的视觉关联方式,并再次应用。
如果我们不是人类,而是蛇类,那么画面识别所寻找的𝒇就和现在的不一样。
画面识别实际上是寻找(学习)人类的视觉关联方式𝒇,并再次应用。
二、图片被识别成什么取决于哪些因素
下面用两张图片来体会识别结果取决于哪些因素。
1.老妇与少女
请观察上面这张图片,你看到的是老妇还是少女以不同的方式去观察这张图片会得出不同的答案。
图片可以观察成有大鼻子、大眼睛的老妇。
也可以被观察成少女,但这时老妇的嘴会被识别成少女脖子上的项链,而老妇的眼睛则被识别为少女的耳朵。
2.海豚与男女
!
上面这张图片如果是成人观察,多半看到的会是一对亲热的男女。
倘若儿童看到这张图片,看到的则会是一群海豚(男女的轮廓是由海豚构造出的)。
所以,识别结果受年龄,文化等因素的影响,换句话说:
图片被识别成什么不仅仅取决于图片本身,还取决于图片是如何被观察的。
图像表达
我们知道了“画面识别是从大量的
数据中寻找人类的视觉关联方式𝒇,并再次应用。
其
-是输入,表示所看到的东西
-输出,表示该东西是什么。
在自然界中,
是物体的反光,那么在计算机中,图像又是如何被表达和存储的呢
[from]
?
图像在计算机中是一堆按顺序排列的数字,数值为0到255。
0表示最暗,255表示最亮。
你可以把这堆数字用一个长长的向量来表示,也就是tensorflow的mnist教程中784维向量的表示方式。
然而这样会失去平面结构的信息,为保留该结构信息,通常选择矩阵的表示方式:
28x28的矩阵。
上图是只有黑白颜色的灰度图,而更普遍的图片表达方式是RGB颜色模型,即红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的比例相加,以产生多种多样的色光。
这样,RGB颜色模型中,单个矩阵就扩展成了有序排列的三个矩阵,也可以用三维张量去理解,其中的每一个矩阵又叫这个图片的一个channel。
在电脑中,一张图片是数字构成的“长方体”。
可用宽width,高height,深depth来描述,如图。
画面识别的输入
是shape为(width,height,depth)的三维张量。
接下来要考虑的就是该如何处理这样的“数字长方体”。
画面不变性
在决定如何处理“数字长方体”之前,需要清楚所建立的网络拥有什么样的特点。
我们知道一个物体不管在画面左侧还是右侧,都会被识别为同一物体,这一特点就是不变性(invariance),如下图所示。
'
我们希望所建立的网络可以尽可能的满足这些不变性特点。
为了理解卷积神经网络对这些不变性特点的贡献,我们将用不具备这些不变性特点的前馈神经网络来进行比较。
图片识别--前馈神经网络
方便起见,我们用depth只有1的灰度图来举例。
想要完成的任务是:
在宽长为4x4的图片中识别是否有下图所示的“横折”。
图中,黄色圆点表示值为0的像素,深色圆点表示值为1的像素。
我们知道不管这个横折在图片中的什么位置,都会被认为是相同的横折。
若训练前馈神经网络来完成该任务,那么表达图像的三维张量将会被摊平成一个向量,作为网络的输入,即(width,height,depth)为(4,4,1)的图片会被展成维度为16的向量作为网络的输入层。
再经过几层不同节点个数的隐藏层,最终输出两个节点,分别表示“有横折的概率”和“没有横折的概率”,如下图所示。
)
下面我们用数字(16进制)对图片中的每一个像素点(pixel)进行编号。
当使用右侧那种物体位于中间的训练数据来训练网络时,网络就只会对编号为5,6,9,a的节点的权重进行调节。
若让该网络识别位于右下角的“横折”时,则无法识别。
解决办法是用大量物体位于不同位置的数据训练,同时增加网络的隐藏层个数从而扩大网络学习这些变体的能力。
然而这样做十分不效率,因为我们知道在左侧的“横折”也好,还是在右侧的“横折”也罢,大家都是“横折”。
为什么相同的东西在位置变了之后要重新学习有没有什么方法可以将中间所学到的规律也运用在其他的位置换句话说,也就是让不同位置用相同的权重。
图片识别--卷积神经网络
卷积神经网络就是让权重在不同位置共享的神经网络。
局部连接
在卷积神经网络中,我们先选择一个局部区域,用这个局部区域去扫描整张图片。
局部区域所圈起来的所有节点会被连接到下一层的一个节点上。
&
为了更好的和前馈神经网络做比较,我将这些以矩阵排列的节点展成了向量。
下图展示了被红色方框所圈中编号为0,1,4,5的节点是如何通过
连接到下一层的节点0上的。
这个带有连接强弱的红色方框就叫做filter或kernel或featuredetector。
而filter的范围叫做filtersize,这里所展示的是2x2的filtersize。
(1)
第二层的节点0的数值就是局部区域的线性组合,即被圈中节点的数值乘以对应的权重后相加。
用
表示输入值,
表示输出值,用图中标注数字表示角标,则下面列出了两种计算编号为0的输出值
的表达式。
注:
在局部区域的线性组合后,也会和前馈神经网络一样,加上一个偏移量
。
(2)
空间共享
#
当filter扫到其他位置计算输出节点
时,
,包括
是共用的。
下面这张动态图展示了当filter扫过不同区域时,节点的链接方式。
动态图的最后一帧则显示了所有连接。
可以注意到,每个输出节点并非像前馈神经网络中那样与全部的输入节点连接,而是部分连接。
这也就是为什么大家也叫前馈神经网络(feedforwardneuralnetwork)为fully-connectedneuralnetwork。
图中显示的是一步一步的移动filter来扫描全图,一次移动多少叫做stride。
空间共享也就是卷积神经网络所引入的先验知识。
输出表达
如先前在图像表达中提到的,图片不用向量去表示是为了保留图片平面结构的信息。
同样的,卷积后的输出若用上图的排列方式则丢失了平面结构信息。
所以我们依然用矩阵的方式排列它们,就得到了下图所展示的连接。
$
这也就是你们在网上所看到的下面这张图。
在看这张图的时候请结合上图的连接一起理解,即输入(绿色)的每九个节点连接到输出(粉红色)的一个节点上的。
经过一个featuredetector计算后得到的粉红色区域也叫做一个“ConvolvedFeature”或“ActivationMap”或“FeatureMap”。
Depth维的处理
现在我们已经知道了depth维度只有1的灰度图是如何处理的。
但前文提过,图片的普遍表达方式是下图这样有3个channels的RGB颜色模型。
当depth为复数的时候,每个featuredetector是如何卷积的
现象:
2x2所表达的filtersize中,一个2表示width维上的局部连接数,另一个2表示height维上的局部连接数,并却没有depth维上的局部连接数,是因为depth维上并非局部,而是全部连接的。
…
在2D卷积中,filter在张量的width维,height维上是局部连接,在depth维上是贯串全部channels的。
类比:
想象在切蛋糕的时候,不管这个蛋糕有多少层,通常大家都会一刀切到底,但是在长和宽这两个维上是局部切割。
下面这张图展示了,在depth为复数时,filter是如何连接输入节点到输出节点的。
图中红、绿、蓝颜色的节点表示3个channels。
黄色节点表示一个featuredetector卷积后得到的FeatureMap。
其中被透明黑框圈中的12个节点会被连接到黄黑色的节点上。
在输入depth为1时:
被filtersize为2x2所圈中的4个输入节点连接到1个输出节点上。
在输入depth为3时:
被filtersize为2x2,但是贯串3个channels后,所圈中的12个输入节点连接到1个输出节点上。
在输入depth为
时:
2x2x
个输入节点连接到1个输出节点上。
(可从vectary在3D编辑下查看)
注意:
三个channels的权重并不共享。
即当深度变为3后,权重也跟着扩增到了三组,如式子(3)所示,不同channels用的是自己的权重。
式子中增加的角标r,g,b分别表示redchannel,greenchannel,bluechannel的权重。
:
(3)
计算例子:
用
表示redchannel的编号为0的输入节点,
表示greenchannel编号为5个输入节点。
表示bluechannel。
如式子(4)所表达,这时的一个输出节点实际上是12个输入节点的线性组合。
(4)
当filter扫到其他位置计算输出节点
时,那12个权重在不同位置是共用的,如下面的动态图所展示。
透明黑框圈中的12个节点会连接到被白色边框选中的黄色节点上。
每个filter会在width维,height维