一、卷积神经网络的层级结构
如下图所示:
上图中CNN要做的事情是:给定一张图片,不知道是什么东西,也不知道是什么种类的东西,现在需要模型判断这张图片里具体是一个什么东西,即输出一个结果
比如上图就应输出,是车,品牌是特斯拉,或者一些其他你想要获取的特征信息
最左边是
数据输入层:对数据做一些处理,比如,去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等
( CNN只对训练集做“去均值” )
中间是
Conv:卷积计算层,线性乘积求和
ReLU:激励层或激活层
Pool:池化层,即取区域平均或最大
最右边是
FC:全连接层
其中,卷积计算层是CNN的核心
二、卷积操作
对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器Filter)做内积(逐个元素相乘再求和)的操作,即卷积操作
举一个例子,如下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据
可以发现, -8 是由中间滤波器Filter的矩阵与对应数据窗口的矩阵做内积得到的
三、图像卷积
对图像进行卷积时,输入是一定区域大小(w*h)的数据,和滤波器Filter(带着一组固定权重的神经元)做内积后得到的新二维数据
具体来说,左边输入图像,中间部分就是滤波器Filter(带着一组固定权重的神经元),不同的滤波器Filter会得到不同的输出数据,比如颜色深浅、轮廓等
即提取图像的不同特征,则用不同的滤波器Filter,来提取想要的特征信息
如下图所示
在CNN中,滤波器Filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。
在这个过程中,通常有这么几个参数:
深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数
步长stride:决定滑动多少步可以到边缘
填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除
下图是CNN进行上述过程的GIF动图:
观察上图,可以发现:
该网络有两个神经元,即depth=2,也意味着有两个滤波器
数据窗口每次移动两个步长取3*3的局部数据,即stride=2
填充值zero-padding=1
然后分别以两个滤波器Filter为轴滑动数组进行卷积计算,得到两组不同的结果
左边输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)
当左边数据在变化时,每次滤波器都是针对局部的数据窗口进行卷积,这就是CNN中的局部感知机制
与此同时,数据窗口滑动,导致输入变化,但中间滤波器Filter的权重(即每个神经元连接数据窗口的权重)是固定不变的,即CNN中的参数(权重)共享机制
四、Pool池化层(即取区域平均或最大)
上图所展示的是取区域最大
左上角2x2的矩阵中取 6 最大,右上角2x2的矩阵中取 8 最大,左下角2x2的矩阵中取 3 最大,右下角2x2的矩阵中取 4 最大,所以得到右边部分的结果:6 8 3 4