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