整体结构
基于全连接层(Affine层)的网络的例子:
基于CNN的网络的例子:新增了Convolution层和Pooling层(用灰色的方块表示)
CNN卷积神经网络示意图
卷积神经网络与全连接神经网络的区别:
1、总有至少一个的卷积层,用以提取特征
2、卷积层级之间的神经元是局部连接和权值共享,这样的设计大大减少了(w,b)的数量,加快了训练
卷积层通俗易懂来说就是压缩提纯
卷积神经网络就是一种用卷积等操作,代替了全连接神经网络中的运算,这种替代可以是全部的也可以是部分的。
CNN要做的事情就是:给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:如果是车 那是什么车
最左边是:
数据输入层,对数据做一些处理,比如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等。CNN只对训练集做“去均值”这一步。
中间是:
CONV:卷积计算层,线性乘积求和。
RELU:激励层,ReLU是激活函数的一种。
POOL:池化层,可分为平均池化层和最大池化
最右边是:
FC:全连接层
CONV卷积计算层是CNN的核心
数据输入层:神经网络需要对输入的数据进行预处理操作,需要进行预处理的主要原因是:
输入单位不一样,可能会导致神经网络收敛速度慢,训练时间长
数据范围大的输入在模式分类中的作用可能偏大,而数据范围小的作用就有能偏小
由于神经网络中存在的激活函数是有值域限制的,因此需要将网络训练的目标数据映射到激活函数的值域
S型激活函数在(0,1)区间以外区域很平缓,区分度太小。例如S型函数f(X),f(100)与f(5)只相差0.0067
常见的数据预处理的方式有以下几种:
1.均值化处理 — 即对于给定数据的每个特征减去该特征的均值(将数据集的数据中心化到0)
2.归一化操作 — 在均值化的基础上再除以该特征的方差(将数据集各个维度的幅度归一化到同样的范围内)
3.PCA降维 — 将高维数据投影到低维的坐标轴上,并要求投影后的数据集具有最大的方差(去除了特征之间的相关性,用于获取低频信息)
4.白化 — 在PCA的基础上对转换后的数据每个特征轴上的幅度进行归一化,用于获取高频信息。
X -= np.mean(x,axis=0) #去均值
cov = np.dot(x.T,x)/x.shape[0] #计算协方差
u,s,v = np.linalg.svd(cov) #进行svd分解
xrot = np.dot(x,u)
x=np.dot(x,u[:,:2]) #计算pca
x=xrot/np.sqrt(s+1e-5) #白化
备注:实际上在卷积神经网络中,一般并不会适用PCA和白化的操作,一般去均值和归一化使用的会比较多。
建议:对数据特征进行预处理,去均值,归一化
CNN怎么进行识别
简言之,当我们给定一个"X"的图案,计算机怎么识别这个图案就是“X”呢?一个可能的办法就是计算机存储一张标准的“X”图案,然后把需要识别的未知图案跟标准"X"图案进行比对,如果二者一致,则判定未知图案即是一个"X"图案。
而且即便未知图案可能有一些平移或稍稍变形,依然能辨别出它是一个X图案。如此,CNN是把未知图案和标准X图案一个局部一个局部的对比,如下图所示:
而未知图案的局部和标准X图案的局部一个一个比对时的计算过程,便是卷积操作。卷积计算结果为1表示匹配,否则不匹配。
具体而言,为了确定一幅图像是包含有"X"还是"O",相当于我们需要判断它是否含有"X"或者"O",并且假设必须两者选其一,不是"X"就是"O"。
理想的情况就像下面这个样子:
标准的"X"和"O",字母位于图像的正中央,并且比例合适,无变形
对于计算机来说,只要图像稍稍有一点变化,不是标准的,那么要解决这个问题还是不是那么容易的:
计算机要解决上面这个问题,一个比较天真的做法就是先保存一张"X"和"O"的标准图像(就像前面给出的例子),然后将其他的新给出的图像来和这两张标准图像进行对比,看看到底和哪一张图更匹配,就判断为哪个字母。
但是这么做的话,其实是非常不可靠的,因为计算机还是比较死板的。在计算机的“视觉”中,一幅图看起来就像是一个二维的像素数组(可以想象成一个棋盘),每一个位置对应一个数字。在我们这个例子当中,像素值"1"代表白色,像素值"-1"代表黑色。
当比较两幅图的时候,如果有任何一个像素值不匹配,那么这两幅图就不匹配,至少对于计算机来说是这样的。
对于这个例子,计算机认为上述两幅图中的白色像素除了中间的3*3的小方格里面是相同的,其他四个角上都不同:
因此,从表面上看,计算机判别右边那幅图不是"X",两幅图不同,得出结论:
但是这么做,显得太不合理了。理想的情况下,我们希望,对于那些仅仅只是做了一些像平移,缩放,旋转,微变形等简单变换的图像,计算机仍然能够识别出图中的"X"和"O"。就像下面这些情况,我们希望计算机依然能够很快并且很准的识别出来:
这也就是CNN出现所要解决的问题。
Features
对于CNN来说,它是一块一块地来进行比对。它拿来比对的这个“小块”我们称之为Features(特征)。在两幅图中大致相同的位置找到一些粗糙的特征进行匹配,CNN能够更好的看到两幅图的相似性,相比起传统的整幅图逐一比对的方法。
每一个feature就像是一个小图(就是一个比较小的有值的二维数组)。不同的Feature匹配图像中不同的特征。在字母"X"的例子中,那些由对角线和交叉线组成的features基本上能够识别出大多数"X"所具有的重要特征。
这些features很有可能就是匹配任何含有字母"X"的图中字母X的四个角和它的中心。那么具体到底是怎么匹配的呢?如下:
到这里只是知道了这些Features是这么在原图上面进行匹配的。但是你还不知道在这里面究竟是咋样进行数学计算的,比如下面这个
33的小块到底干了什么?
这里面的数学操作就是我们常说的卷积操作。
什么是卷积?
对图像(不同数据窗口的数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的卷积操作,也是卷积神经网络的名字来源。
非严格意义上来讲,下面中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元,多个滤波器叠加便成了卷积层。
举个栗子:如下图所示,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数组。
分解上图
中间滤波器filter与数据窗口做内积,其具体计算过程是:40 + 00 + 00 + 00 + 01 + 01 + 00 + 01 + -42 = -8
卷积层进行的处理就是卷积运算,卷积运算相当于图像处理中的“滤波器运算”。
在本例中,输入大小是(4, 4),滤波器大小是(3, 3),输出大小是(2, 2)。另外,有的文献中也会用“核”这个词来表示这里所说的“滤波器”。
在全连接的神经网络中,除了权重参数,还存在偏置。CNN中,滤波器的参数就对应之前的权重。并且,CNN中也存在偏置。
偏置通常只有1个(1 × 1)(本例中,相对于应用了滤波器的4个数据,偏置只有1个),这个值会被加到应用了滤波器的所有元素上。
填充:在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0等)这是卷积运算中经常会用到的处理。
填充的目的: 1.保持边界信息
2.使得输入输出图像尺寸一致
在图7-6的例子中,对大小为(4, 4)的输入数据应用了幅度为1的填充。“幅度为1的填充”是指用幅度为1像素的0填充周围。
如图7-6所示,通过填充,大小为(4, 4)的输入数据变成了(6, 6)的形状。然后,应用大小为(3, 3)的滤波器,生成了大小为(4, 4)的输出数据。这个例子中将填充设成了1,不过填充的值也可以设置成2、3等任意的整数。
步幅:应用滤波器位置间隔称为步幅。
在图7-7的例子中,对输入大小为(7, 7)的数据,以步幅2应用了滤波器。通过将步幅设为2,输出大小变为(3, 3)。像这样,步幅可以指定应用滤波器的间隔。
总结:填充可以增加输出的高和宽。这常用来使输出与输入具有相同的高和宽。
步幅可以减小输出的高和宽,例如输出的高和宽仅为输入的高和宽的1/n(n为大于1的整数)
GIF动态卷积图:
在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积运算。每计算完一个数据窗口内的局部数据后,数据窗口不断的平滑移动,至到计算完所有的数据。这个过程中,有这么几个参数:
a.深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
b.步长stride:决定滑动多少步可以到边缘。
c.填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑到末尾位置,通俗的讲就是为了总长能被步长整除。
可以看到:
两个神经元,即depth=2,意味着有两个滤波器。
数据窗口每次移动两个步长取33的局部数据,即stride=2。
zero-padding=1。
然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。
左边是输入(773中,77代表图像的像素/长宽,3代表R、G、B 三个颜色通道红、绿、蓝)
中间部分是两个不同的滤波器Filter w0、Filter w1
最右边则是两个不同的输出
随着左边数据窗口的平移滑动,滤波器Filter w0 / Filter w1对不同的局部数据进行卷积计算。
值得一提的是:左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。
打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。如果一眼就看到全世界,你会累死,而且一下子接受全世界所有信息,你大脑接收不过来。当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。比如看美女,对脸、腿是重点关注,所以这3个输入的权重相对较大。
与此同时,数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。
再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。btw,不同人的双眼 看同一个局部信息 所感受到的不同,即一千个读者有一千个哈姆雷特,所以不同的滤波器 就像不同的双眼,不同的人有着不同的反馈结果。
CNN之激励层与池化层
ReLu激励层
在实际梯度下降中,激活函数sigmod容易饱和、造成终止梯度传递,且没有0中心化。可以尝试另外一个激活函数:ReLU
在CNN中一般使用ReLU函数作为激活函数。它的作用是将卷积层的输出结果做非线性映射。
ReLU的优点是收敛快、求梯度简单。
池化层
池化是缩小高、长方向上的空间的运算。比如,如图7-14所示,进行将2 × 2的区域集约成1个元素的处理,缩小空间大小。
池化层的主要功能是:通过逐步减小表征的空间尺寸来减小参数量和网络中的计算;池化层在每个特征图上独立操作。使用池化层可以压缩数据和参数的量,减小过拟合。简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。
最大池化:选择每个小窗口中最大值作为需要的特征像素点
平均池化:选择每个小窗口中平均值作为需要的特征像素点
FC全连接层
类似于传统神经网络中的结构,FC层中的神经元连接着之前层次的所有激活输出;换一句话来讲的话,就是俩层之间所有的神经元都有权重连接;通常情况下,在CNN中,FC层只会在尾部出现。
通过全连接结构,将前面输出的特征重新组合成一张完整的图像。
Batch Normalization层
Batch Norm 有以下优点:
可以使学习快速进行(可以增大学习率)
不那么依赖初始值(对初始值不用那么神经质)
抑制过拟合(降低Dropout等的必要性)防止梯度消失
Batch Norm的思路是调整各层的激活值分布使其拥有适当的广度。为此,要向神经网络中插入对数据分布进行正规化的层,即Batch
Normalization层(下文简称Batch Norm层),如图6-16所示。
Batch Norm,顾名思义,以进行学习时的mini-batch为单位,按mini-batch进行正规化。具体而言,就是进行使数据分布的均值为0、方差为1的正规化。
Batch Norm缺点:
如果网络层次较深,加入BN层的话,可能会导致模型训练速度很慢
CNN的优缺点:
优点:1、使用局部感知和参数共享机制(共享卷积核),对于较大的数据集处理能力较高。对高维数据的处理没有压力。
2、能够提取图像的深层次信息,模型表达效果好
3、不需要手动进行特征选择,只要训练好卷积核W和偏置项b,即可得到特征值。
缺点:
1、需要进行调参,模型训练时间较长,需要的样本较多,一般建议使用GPU进行训练。
2、物理含义不明,每层中的结果无法解释,这是神经网络的共有缺点。