本篇是神经网络体系搭建的第三篇,解决体系搭建的卷积神经网络相关问题,详见神经网络体系搭建(序)
卷积神经网络是一种空间上共享参数的神经网络。
像素间具有临近性,图片中相邻像素在一起时有特殊意义的,但是普通非卷积网络中忽略了这一点,把输入图片的每个像素与下一层的神经元相连,没有利用好这些信息,于是有了卷积神经网络。
比如图片识别。卷积神经网络模仿人识别图片(狗)的一种方法:先是特定部位,比如鼻子、嘴、眼睛……把这些拼起来得到一条狗。 卷积神经网络相似,它自己通过正向和反向传播学习识别基本的直线,曲线,然后是形状,点块,然后是图片中更复杂的物体。最终 CNN 分类器把这些大的,复杂的物体综合起来识别图片。
一句话讲就是,训练时候不断将图细化,自己学习特征,得到分类器。
第一个大正方体(256x265xRGB)代表一张有三个色彩通道的图片,是输入它height、wide、depth分别是256,256和3。
取图片一小块1,运行一个有k2个输出的小网络,在不改变权重3的情况下,把小网络滑过4整张图片,得到一幅新图,就是第二个正方体(128x128x16),k就是depth。这个过程就是卷积。通过卷积操作不断挤压空间维度,增加深度信息,在最后放置一个分类器,根据信息进行分类。
如何得到patch/kernel呢?
使用“滤波器(Filter)”,滤波器和patch的大小一样,“照”在patch上,在图片上滑过的就是滤波器。
通常会有多个滤波器,不同滤波器提取一个 patch 的不同特性。例如,一个滤波器寻找特定颜色,另一个寻找特定物体的特定形状。卷积层滤波器的数量被称为滤波器深度 ——来自优达学城
每个patch与下一层的多少个神经元相连呢?
这取决于滤波器的深度,如果深度是 k,我们把每个 patch 与下一层的 k 个神经元相连。这样下一层的高度就是 k。
为什么让1个patch连k个神经元呢? 因为一个patch可以有多个可供提取的特点。
为什么要权重共享呢? 可以控制神经网络使用的内存空间。
比如识别一张照片中的猫,猫的位置是不重要的,如果网络要识别猫在左上角的情况或者右上角的情况,那工作量就很大了。当知道输入可能包含相同类型的信息时,可以共享权重,并利用这些输入共同训练权重。
可以做这样的计算: 假设H = height, W = width, D = depth
输入数据: - 维度为 32x32x3 (HxWxD) - 20个滤波器,维度为 8x8x3 (HxWxD) - stride(步长)高和宽的都为 2 (S) - padding 大小为1 (P)
输出层: - 14x14x20 (HxWxD)
没有参数共享,每个输出层的神经元必须连接到滤波器的每个神经元。此外,每个输出层的神经元必须连接到一个偏置神经元。
则卷积层有总共有(8 * 8 * 3 + 1) * (14 * 14 * 20) = 756560个参数。
有了参数共享,每个输出通道的神经元与相同通道的其它神经元共享权值。参数的数量与滤波器神经元的数量相同,加上偏置,再乘以输出层的通道数。
则卷积层总计有 (8 * 8 * 3 + 1) * 20 = 3840 + 20 = 3860个参数。是之前的196分之一。
理解维度可以帮你在模型大小和模型质量上,做精确的权衡。
假设H = height, W = width, D = depth
我们有 - 一个输入维度是 32x32x3 (HxWxD) - 20个维度为 8x8x3 (HxWxD) 的滤波器 - 高和宽的stride(步长)都为 2。(S) - padding 大小为1 (P)
计算新的高度和宽度的公式是: new_height = (input_height - filter_height + 2 * P)/S + 1 new_width = (input_width - filter_width + 2 * P)/S + 1
则卷积层输出的维度为14x14x20
我们通过调整步幅(stride),将过滤器(filter)每次移动几个像素的方法来降低特征图的尺寸,如果我们不采用每次移动多个像素的方法,而是每次依然移动很小的步幅,比如一个像素,但是把每个相邻的所有卷积通过某种操作结合在一起,这种操作就叫做池化。
通常把相邻卷积结合在一起的方式有: - 最大池化 比如通过卷积得到一个输出层,然后我们有一个2x2的池化层,则通过池化层后的输出为2x2网格中最大的数。 - 平均池化 同样是上例,通过池化层的输出为2x2网格中所有数的平均数。
池化层的优点有: - 减小输出大小 - 降低过拟合 缺点: - 进行卷积的步幅小,计算量大 - 有更多的超参数要调整——(1)池化尺寸(2)池化步幅
近期,池化层不是很受青睐,因为: - 现在数据集越来越大,我们更担心欠拟合的问题 - Dropout是一个更好的正则化方法 - 池化导致信息损失。比如n个数字的最大池化,只保留了1个数字,其余n-1个全部丢失。 ——来自优达学城
为什么要用1x1卷积呢?
传统的卷积,它基本是运行在一小块图像上的线性分类器,但如果在中间加一个1x1卷积,就用运行在一小块图像上的神经网络,代替了线性分类器。
在卷积操作中散步一些1x1卷积是一种使模型变更深的低耗高效的办法,并且含有更多参数,但未完全改变神经网络结构。
神经网络的每一层,都可以选择进行池化、卷积运算,Inception模块不限于单个卷积运算,而是将多个模块组合,如下图:
它看起来很复杂,但是根据你选择参数的方式,模型的参数总数可能非常少,但性能比使用简单卷积时要好。
除了前几篇网络的一系列可调参数外还有: - stride:步幅 - k:滤波器深度 - 滤波器大小,数值 如果池化的话,则还有: (1)池化尺寸(2)池化步幅
至此,卷积神经网络的骨架搭建完毕。 - 卷积神经网络是什么? 卷积神经网络是一种空间上共享参数的神经网络。 - 卷积神经网络和神经网络有什么区别? 有卷积层,权重共享 - 卷积神经网络模型有哪些参数可以调整(优化)? 见上。
以上内容来自822实验室神经网络知识分享 我们的822,我们的青春 欢迎所有热爱知识热爱生活的朋友和822思享实验室一起成长,吃喝玩乐,享受知识。