CNN初学者—从这入门

一、本文是到目前为止我见到过的关于CNN最最小白的入门教程,没有之一!原文地址:http://xilinx.eetrend.com/article/10827git

二、本文仅供学术交流,若是不当心侵犯了你们的利益,还望海涵,并联系博主删除。特别是做者Sanjay Chan!github


CNN理论入门步骤:算法

一、建议初学者先看从卷积计算到卷积神经网络CNN,了解CNN的来源和卷积的概念网络

二、阅读本文了解CNN的结构和基本原理架构

三、阅读CNN笔记:通俗理解卷积神经网络,此文介绍得很全面ide

四、想要进阶还得看斯坦福CNN教程,这样,CNN初学者在理论上就基本上入门了函数


背景性能

以前在网上搜索了好多好多关于CNN的文章,因为网络上的文章不少断章取义或者描述不清晰,看了不少youtobe上面的教学视频仍是没有弄懂,最后通过痛苦漫长的煎熬以后对于神经网络和卷积有了粗浅的了解。优化

因而在这里记录下所学到的知识,关于CNN 卷积神经网络,须要总结深刻的知识有不少:动画

人工神经网络 ANN 卷积神经网络 CNN 卷积神经网络 CNN - BP算法 卷积神经网络 CNN - LetNet分析 卷积神经网络 CNN - caffe应用 全卷积神经网 FCN

若是对于人工神经网络或者神经元模型不是太了解,建议先去了解《人工神经网络ANN》。

卷积神经网络
卷积神经网络说白了就是神经网络的一种分支,所以看懂神经元尤其重要:

卷积神经网络沿用了普通的神经元网络即多层感知器的结构,是一个前馈网络。以应用于图像领域的CNN为例,大致结构如图。

根据上图 卷积神经网络 ConvNet 能够分为4大层:

1. 图像输入Image Input:为了减少后续BP算法处理的复杂度,通常建议使用灰度图像。也可使用RGB彩色图像,此时输入图像原始图像的RGB三通道。对于输入的图像像素份量为 [0, 255],为了计算方便通常须要归一化,若是使用sigmoid激活函数,则归一化到[0, 1],若是使用tanh激活函数,则归一化到[-1, 1]。

2. 卷积层(Convolution Layer):特征提取层(C层) - 特征映射层(S层)。将上一层的输出图像与本层卷积核(权重参数w)加权值,加偏置,经过一个Sigmoid函数获得各个C层,而后下采样subsampling获得各个S层。C层和S层的输出称为Feature Map(特征图)。

3. 光栅化(Rasterization):为了与传统的多层感知器MLP全链接,把上一层的全部Feature Map的每一个像素依次展开,排成一列。

4. 多层感知器(MLP):最后一层为分类器,通常使用Softmax,若是是二分类,固然也可使用线性回归Logistic Regression,SVM,RBM。

详细地展开2卷积层:

C层:特征提取层。每一个神经元的输入与前一层的局部接受域相连,并提取该局部的特征。一旦该局部特征被提取后,它与其它特征间的位置关系也随之肯定下来。

S层:特征映射层。网络的每一个计算层由多个特征映射组成,每一个特征映射为一个平面,平面上全部神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数做为卷积网络的激活函数,使得特征映射具备位移不变性。特征映射结构采用影响函数核小的sigmoid函数做为卷积网络的激活函数,使得特征映射具备位移不变性。此外,因为一个映射面上的神经元共享权值,于是减小了网络自由参数的个数。卷积神经网络中的每个卷积层都紧跟着一个用来求局部平均与二次提取的计算层,这种特有的两次特征提取结构减少了特征分辨率。

此外,因为一个映射面上的神经元共享权值,于是减小了网络自由参数的个数,下降了网络参数选择的复杂度。卷积神经网络中的每个特征提取层(C层)都紧跟着一个用来求局部平均与二次提取的计算层(S层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力。

1 卷积

卷积层是卷积核在上一级输入层上经过逐一滑动窗口计算而得,卷积核中的每个参数都至关于传统神经网络中的权值参数,与对应的局部像素相链接,将卷积核的各个参数与对应的局部像素值相乘之和,(一般还要再加上一个偏置参数),获得卷积层上的结果。以下图所示。

今天公司学通信的同事跟我讨论到底卷积是个什么东西,给我说经过卷积后,信号当中特别是时域会放大,https://en.wikipedia.org/wiki/Convolution。所以在FCN当中会经过卷积越变越大,可是这明明违背了图像卷积的概念。

下面这个动画更好地解释:


2 CNN三大核心思想

卷积神经网络CNN的出现是为了解决MLP多层感知器全链接和梯度发散的问题。其引入三个核心思想:1.局部感知(local field),2.权值共享(Shared Weights),3.下采样(subsampling)。极大地提高了计算速度,减小了链接数量。

2.1 局部感知

形象地说,就是模仿你的眼睛,想一想看,你在看东西的时候,目光是聚焦在一个相对很小的局部的吧?严格一些说,普通的多层感知器中,隐层节点会全链接到一个图像的每一个像素点上,而在卷积神经网络中,每一个隐层节点只链接到图像某个足够小局部的像素点上,从而大大减小须要训练的权值参数。

对于一个 1000∗1000 的输入图像而言,若是下一个隐藏层的神经元数目为 10个,采用全链接则有 1000∗1000∗106=1012 个权值参数,如此数目巨大的参数几乎难以训练;而采用局部链接,隐藏层的每一个神经元仅与图像中 10∗10的局部图像相链接,那么此时的权值参数数量为 10∗10∗106=108,将直接减小4个数量级。

以下图所示,左边是每一个像素的全链接,右边是每行隔两个像素做为局部链接,所以在数量上,少了不少权值参数数量(每一条链接每一条线须要有一个权值参数,具体忘记了的能够回顾单个[神经元模型]。所以 局部感知就是:
经过卷积操做,把 全链接变成局部链接 ,由于多层网络可以抽取高阶统计特性, 即便网络为局部链接,因为格外的突触链接和额外的神经交互做用,也可使网络在不十分严格的意义下得到一个全局关系。

下面咱们来详细看一下到底局部感知如何使 全链接变成局部链接,按照人工神经网络的方法,把输入图像的像素一字排开以后,每个像素值就是一个神经元输入,须要对隐层或者输出层作全链接,如上图左侧所示。卷积神经网络引入卷积概念后,卷积核经过原图像,而后卷积核对原图像上符合卷积核大小的像素进行加权求和,每一次只是对符合卷积核的图像像素作卷积,这就是局部感知的概念,使 全链接变成局部链接。

2.2 权值共享

尽管局部感知使计算量减小了几个数量级,但权重参数数量依然不少。能不能再进一步减小呢?方法就是权值共享。

权值共享:不一样的图像或者同一张图像共用一个卷积核,减小重复的卷积核。同一张图像当中可能会出现相同的特征,共享卷积核可以进一步减小权值参数。

以下图所示,为了找到鸟嘴,一个激活函数A须要检测图像左侧有没有鸟嘴,另一个激活函数B须要检测另一张图像中间有没有相似的鸟嘴。其实,鸟嘴均可能具备一样的特征,只须要一个激活函数C就能够了,这个时候,就能够共享一样的权值参数(也就是卷积核)。

若是使用了权值共享(共同使用一个卷积核),那么将能够大大减小卷积核的数量,加快运算速度。天下武功,惟快不破。

举个栗子,在局部链接中隐藏层的每个神经元链接的是一个 10∗10 的局部图像,所以有 10∗10 个权值参数,将这 10∗10 个权值参数共享给剩下的神经元,也就是说隐藏层中 106 个神经元的权值参数相同,那么此时无论隐藏层神经元的数目是多少,须要训练的参数就是这 10∗10 个权值参数(也就是卷积核(也称滤波器)的大小。

尽管只有这么少的参数,依旧有出色的性能。可是,这样仅提取了图像的一种特征,若是要多提取出一些特征,须要增长多个卷积核,不一样的卷积核可以获得图像的不一样映射下的特征,称之为 Feature Map。若是有100个卷积核,最终的权值参数也仅为 100∗100=104 个而已。另外,偏置参数b也是共享的,同一种滤波器共享一个。

2.3 池化

在卷积神经网络中,没有必要必定就要对原图像作处理,而是可使用某种“压缩”方法,这就是池化,也就是每次将原图像卷积后,都经过一个下采样的过程,来减少图像的规模。

pooling的好处有什么?
1. 这些统计特征可以有更低的维度,减小计算量。
2. 不容易过拟合,当参数过多的时候很容易形成过分拟合。
3. 缩小图像的规模,提高计算速度。

以下图所示,原图是一张500∗500 的图像,通过subsampling以后哦,变成了一张 250∗250 的图像。这样操做的好处很是明显,虽然通过权值共享和局部链接后的图像权值参数已经大大减小,可是对于计算量来讲,仍是很是巨大,须要消费很大的计算时间,因而为了进一步减小计算量,因而加入了subsampling这个概念,不只仅使图像像素减小了, 同时也减小计算时间。

举个栗子:以最大池化(Max Pooling)为例,1000×1000的图像通过10×10的卷积核卷积后,获得的是991×991的特征图,而后使用2×2的池化规模,即每4个点组成的小方块中,取最大的一个做为输出,最终获得的是496×496大小的特征图。

下采样,即池化,目的是减少特征图,池化规模通常为2×2。经常使用的池化方法有:

Pooling算法

最大池化(Max Pooling)。取4个点的最大值。这是最经常使用的池化方法。
均值池化(Mean Pooling)。取4个点的均值。
可训练池化。训练函数 f ,接受4个点为输入,出入1个点。

因为特征图的变长不必定是2的倍数,因此在边缘处理上也有两种方案:

保留边缘。将特征图的变长用0填充为2的倍数,而后再池化。
忽略边缘。将多出来的边缘直接省去。

3 CNN 物理意义

了解三个关于CNN的核心特性以后,来看看CNN的具体是怎么运做的。

为了从原始图像获得C层,须要把原始图像中的每个像素值做为神经网络当中一个神经元,那么这里把原始输入图像一字排开,做为输入层。经过BP反向传播算法计算好的权值参数(卷积核)去计算C层对应的的每个像素的值。

从上图咱们获得了C层,也就是提取特征后获得特征层,须要对特征层处理减小特征数量,进一步抽取高层特性,所以须要进步特征映射层(S层)。下图的pooling层(S层)使用了max pooling算法,pooling核为2x2,没有重叠部分,取每4个像素中最大的一个像素值做为新的像素值。

那么在这个模型当中,咱们已经肯定了激活函数φ(∗),输入x1,x2,...,xn 是肯定的,未知量就剩下神经元k的突触权值wk1,wk2,...,wkn ,bk 偏置。反向传播算法(back propagation)就是为了求整个神经网络当中的两种未知变量:权值 w 和偏置 b。在上图这个模型当中,卷积核大小为3∗3,也就是有9个权值w组成,所以反向传播的时候就是要求这两个卷积核的权值w,使用大量的图片做为输入就是为了使用BP算法求得卷积核的值,当求得卷积核的值以后,分类的时候输入一张未知的图片,而后经过整个网络,直接就能够获得最终的分类结果,由于权值和偏置已经经过训练求出来了,整个网络没有未知量。

4 卷积神经网络图解

回顾一下开篇的CNN网络结构,输入图像经过和三个可训练的滤波器和可加偏置进行卷积。

滤波过程如图,卷积后在C1层产生三个特征映射图,而后特征映射图中每组的四个像素再进行求和,加权值,加偏置,经过一个Sigmoid函数获得三个S2层的特征映射图。

这些映射图再进过滤波获得C3层。这个层级结构再和S2同样产生S4,特征映射图中每组的像素再进行求和,加权值,加偏置,经过一个Sigmoid函数获得多个freture map(S4)的特征映射图。

最终,这些像素值被光栅化,并链接成一个向量输入到传统的神经网络进行分类判别,获得输出。

小结

卷积神经网络CNN的核心思想是:局部感知(local field),权值共享(Shared Weights)以及下采样(subsampling)这三种思想结合起来,得到了某种程度的位移、尺度、形变不变性,提升了运算速度和精度。

多层网络能够根据其输入引出高阶统计特性, 即便网络为局部链接,因为格外的突触链接和额外的神经交互做用,也可使网络在不十分严格的意义下得到一个全局关系。这也就是CNN使用局部链接以后还得到很好的效果的缘由。


相关文章