目录
一、模式识别、机器学习、深度学习简介
二、相关名词解释
三、介绍CNN(卷积神经网络)
四、矩阵运算
五、参考文章
一、模式识别、机器学习、深度学习简介
模式识别(Pattern recognition)、机器学习(machine learning)和深度学习(deep learning)代表三种不同的思想流派。
模式识别是最古老的(作为一个术语而言,可以说是很过时的)。
机器学习是最基础的(当下初创公司和研究实验室的热点领域之一)。深度学习是非常崭新和有影响力的前沿领域。
1、模式识别
智能程序的诞生。70年代至80年代提出。强调的是如何让一个计算机程序去做一些看起来很“智能”的事情。例如区分“3”和“B”或者“3”和“8”,需要专门手工设计一些分类规则,如滤波,边缘检测和形态学处理等技术。设计到图形处理的专业知识。
2、机器学习
从样本中学习的智能程序。是数据驱动的。90年代初提出。强调的是给计算机程序(或者机器)输入一些数据后,它学习这些数据,而这个学习的步骤是明确的,学习结果是对已有数据的分类和一个预测模型,预测模型可用于对未知数据的预测。
3、深度学习
新世纪的热门方向。强调的是使用的模型(例如卷积神经网络)。模型中的参数可以从数据中学习获得。在深度学习的模型中,很流行的就是被用在大规模图像识别中的卷积神经网络(Convolutional Neural Nets,CNN),简称ConvNets。深度学习需要非常大的计算能力,大多在GPU进行计算。学习深度学习,需要一些线性代数的知识。
4、总结
先看图:
Deep learning,机器学习里面现在比较火的一个topic,本身是神经网络算法的衍生。在图像,语音等富媒体的分类和识别上取得了非常好的效果。深度学习只是机器学习的一个子类,是机器学习一类比较火的算法,本质上还是原来的神经网络。就是用复杂、庞大的神经网络进行机器学习。
二、相关名词解释
1、二值化:
图像的二值化,就是将图像上的像素点的灰度值设置为0或255(白色为255,黑色为0),也就是将整个图像呈现出明显的只有黑和白的视觉效果。作用就是:保留想要的像素点,去掉干扰像素点。(注意,二值化不是把彩色图像变成黑白图像)。
如图:
2、灰度值:
景物各点的颜色及亮度不同,摄成的黑白照片上各点呈现不同程度的灰色。把白色与黑色之间按对数关系分成若干级,称为“灰度等级”。范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像,在医学、图像识别领域有很广泛的用途。
3、标量(scalar):
亦称“无向量”。有些物理量,只具有数值大小,而没有方向,部分有正负之分。物理学中,标量(或作纯量)指在坐标变换下保持不变的物理量。用通俗的说法,标量是只有大小,没有方向的量。
4、向量:
在数学中,向量(也称为欧几里得向量、几何向量、矢量),指具有大小(magnitude)和方向的量。
5、线性组合:
线性组合是一个线性代数中的概念,代表一些抽象的向量各自乘上一个标量后再相加。(得到的这个值就是向量们的一个线性组合)。
如果存在有限多个向量(v1、v2、...、vk)属于S,和属于F的对应标量(a1、a2、...、ak),使得v = a1v1+a2v2+...+akvk,则称v是S的一个线性组合。
我们亦称v是v1、v2、...、vk的一个线性组合,且a1、a2、...、ak是该线性组合的系数。
6、线性函数
线性函数也常用作一次函数的别称。
线性是指:一次函数,就是说得一元一次方程,用坐标显示是直线.所以叫直线方程.
而除了一次函数外其他的都叫非线性的.比如二次函数[抛物线],幂函数,指数函数等.
三、介绍CNN(卷积神经网络)
在深度学习中,有一个很重要的概念,就是卷积神经网络(CNN),是入门深度学习需要搞懂的东西。
1、人工神经网络
1.1神经元
神经网络由大量的神经元相互连接而成。每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出。
每两个神经元之间的连接代表加权值,称之为权重(weight)。不同的权重和激活函数,则会导致神经网络不同的输出。
神经网络的每个神经元:
即是 z = wx + b的形式,其中:
x1 、x2 表示输入向量;
w1、w2权重,几个输入则意味着有几个权重,即每个输入都被赋予一个权重;
b为偏置量bias;
g(z) 为激活函数;
a 为输出;
举个例子,这周末北京有一草莓音乐节,那去不去呢?
决定你是否去有两个因素(演唱嘉宾和是否有人陪),这两个因素可以对应两个输入,分别用x1、x2表示。
此外,这两个因素对做决策的影响程度不一样,各自的影响程度用权重w1、w2表示。
一般来说,音乐节的演唱嘉宾会非常影响你去不去,所以,我们可以如下表示:
x1:是否有喜欢的演唱嘉宾。
x1 = 1 你喜欢这些嘉宾,x1 = 0 你不喜欢这些嘉宾。
嘉宾因素的权重 w1 = 7.
x2:是否有人陪你去。
x2 = 1 有人陪你去,x2 = 0 没人陪你去。
是否有人陪同的权重w1 = 3.
这样,咱们的决策模型便建立起来了:
g(z) = g(w1*x1 + w2*x2 +b)
g表示激活函数;是选定的一个特定的函数;z作为g的输入;
这里的b可以理解成:为更好达到目标而做调整的偏置项。
一开始为了简单,把激活函数定义成一个线性函数,即对于结果做一个线性变化。比如一个简单的线性激活函数是g(z) = z,输出都是输入的线性变换。后来实际应用中发现,线性激活函数太过局限,很多数据不是线性可分的,于是引入了非线性激活函数。
1.2激活函数
常用的非线性激活函数有sigmoid、tanh、relu等,前两者sigmoid、tanh比较常见于全链接层,后者relu常见于卷积层。
sigmoid的函数表达式如下:
其中z是一个线性组合,如 z = w1*x1 + w2*x2 +b.
sigmoid函数g(z)的图形表示如下( 横轴表示定义域z,纵轴表示值域g(z) ):
可以看到通过代入很大的正数或很小的负数到g(z)函数中可知,其结果趋近于0或1。
也就是说,sigmoid函数的功能是相当于把一个实数压缩至0到1之间。当z是非常大的正数时,g(z)会趋近于1,而z是非常大的负数时,则g(z)会趋近于0。
压缩至0到1有的作用是:可以把激活函数看作一种“分类的概率”,如激活函数的输出为0.9,便可以解释为90%的概率为正样本。
如下图:
z = w1*x1 + w2*x2 +b.
其中b为偏置项,假定取:-30,w1 , w2 都取为20.
如果 x1 = 0,x2 = 0,则z = -30,g(z) =1/( 1 + e^-z ) 趋近于0。此外,从上图sigmoid函数的图形上也可以看出,当z = -30的时候,g(z)的值趋近于0。
如果 x1 = 0,x2 = 1,或者 x1 = 1,x2 = 0 则z = -10,,同样,g(z)的值趋近于0。
如果 x1 = 1,x2 = 1,则z = 10,此时,g(z)趋近于1。
即是只有 x1 和 x2 都取1的时候,g(z)→1,判定为正样本;x1或者x2取0的时候,g(z)→0,判定为负样本,如此达到分类的目的。
1.3 神经网络
将下图的这种单个神经元组织在一起,便形成了神经网络。
下图是一个三层神经网络结构:
上图中最左边的原始输入信息称之为输入层,最右边的神经元称之为输出层(上图中输出层只有一个神经元),中间的叫隐藏层。
输入层(Input layer),众多神经元(Neuron)接受大量非线形输入讯息。输入的讯息称为输入向量。
输出层(Output layer),讯息在神经元链接中传输、分析、权衡,形成输出结果。输出的讯息称为输出向量。
隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。如果有多个隐藏层,则意味着多个激活函数。
每一层都可由单个或多个神经元组成,每一层的输出将会作为下一层的输入数据。
如下图中间的隐藏层,隐藏层的3个神经元a1、a2、a3各自接受来自多个不同权重的输入(因为有x1、x2、x3这三个输入,所以a1 a2
a3都会接受x1 x2 x3各自分别赋予的权重,即几个输入则几个权重),接着,a1、a2、a3又在自身各自不同权重的影响下成为输出层的输入,最终由输出层输出最终结果。
上图中的是一层隐藏层,但实际中也有多层隐藏层,即输入层和输出层中间夹着数层隐藏层,层和层之间是全连接的结构,同一层的神经元之间没有连接。如下图:
2、卷积神经网络的层级结构
卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成,即INPUT(输入层)-CONV(卷积层)-RELU(激活函数)-POOL(池化层)-FC(全连接层)。
cs231n课程(http://cs231n.github.io/convolutional-networks/#overview)里给出了卷积神经网络各个层级结构,如下图:
上图中CNN要做的事情是:给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:是车还是马,如果是车,那是什么车。
最左边是数据输入层(图片-车),对数据做一些处理,如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)等。CNN只对训练集做“去均值”。
中间部分是:
CONV:卷积计算层,线性乘积求和。
RELU:激活层,ReLU是激活函数的一种。
POOL:池化层,即取区域平均或最大(实际应用中发现取最大效果更好)。
最右边是FC:全连接层。连接所有的特征,将输出值送给分类器(如softmax分类器)进行分类,给出分类结果。
这几个部分中,卷积计算层是CNN的核心,下文将重点讲解。
3、CNN卷积计算层
3.1什么是卷积
首先,我们来了解下什么是卷积操作。
对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。
非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。
卷积层是用来进行特征提取,如下图所示:
输入图像是32*32*3,3是它的深度(即R、G、B)。
卷积层是一个5*5*3的filter(感受野、滤波器),这里注意:感受野的深度必须和输入图像的深度相同。
通过一个filter与输入图像的卷积可以得到一个28*28*1的特征图,上图是用了两个filter得到了两个特征图;即是使用了多少个filter,就会得到多少个特征图。
输入图像是32*32*3,filter是5*5*3,如何得到28*28*1的特征图呢?先初步介绍一下:
卷积的计算过程是:filter在图像上从左到右、从上到下滑动(上图的滑动步长为1,即是一个像素)做內积。这里先解释32*32*3如何变成28*28*1的。
(1)32 ---- >28的问题:
图像长是32,filter长是5,从左滑动到右(这里没有在图像加0的情况,这个情况下面会说),每滑动一次,计算一个结果,所以最后的到的图像长是:32 -
5 + 1 = 28。从上滑动到下,同理。
(2)3 ----> 1 的问题:
这个问题简单,跟卷积的计算有关,规定:图像深度是多少,filter的深度就是多少。卷积的计算是:图像的各层次与filter的各层次分别计算后得到的结果再相加,最终才得到特征图上的值。可以知道,不管图像的深度是多少,如果只有一个filter,卷积计算得到的特征图,深度都是1。所以,特征图的深度,与原图像的深度无关,只与filter的个数有关。
接下来,看复杂一点点,通常会使用多层卷积层来得到更深层次的特征图。如下:
现在,应该可以看明白上图的变化了:
32 - 5 + 1 = 28;6个filter;——> 28*28*6;
28 - 5 + 1 = 24;10个filter;——> 24*24*10;
再来看下卷积的计算。下图中,中左边部分是原始输入数据,中间部分是滤波器filter,图中右边是输出的新的二维数据特征图。
滤波器与数据窗口做内积(对应位置数字相乘再相加),其具体计算过程则是:
4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0+ 0*1 + -4*2 = -8
3.2图像上的卷积
如下图的计算过,输入是一定区域大小(width*height)的数据,和滤波器filter(带着一组固定权重的神经元)做内积后等到新的二维数据。
具体来说,左边是图像输入,中间部分就是滤波器filter(带着一组固定权重的神经元),不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。
看一些例子:
图像锐化滤波器SharpnessFilter:
把核加大,就可以得到更加精细的锐化效果:
边缘检测Edge Detection:
浮雕Embossing Filter:
只要加大滤波器,就可以得到更加夸张的效果了:
3.3 完整的卷积计算
在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。
这个过程中,有几个参数:
(1)深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
(2)步长stride:决定滑动多少步可以到边缘。
(3)填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑到末尾位置。通俗地讲就是为了总长能被步长整除。zero
pad项,即为图像加上一个边界,边界元素均为0。(对原输入无影响)一般有:
F=3=> zero pad with 1
F=5 => zero pad with 2
F=7 => zero pad with 3
边界宽度是一个经验值,加上zero pad这一项是为了使输入图像和卷积后的特征图具有相同的维度,如:
输入为5*5*3,filter为3*3*3,在zero pad 为1,则加上zero pad后的输入图像为7*7*3,则卷积后的特征图大小为5*5*1(7-3+1),与输入图像一样(步长为1);
更一般地,(步长不为1)的特征图大小计算如下:
卷积层还有一个特性就是“权值共享”原则。所谓的权值共享就是说,给一张输入图片,用一个filter去扫这张图,filter里面的数叫权重,这张图每个位置就是被同样的filter扫的,所以权重是一样的,也就是共享。
看下面卷积计算的一个图,可以看到:
两个神经元,即depth=2,意味着有两个滤波器。
数据窗口每次移动两个步长,取3*3的局部数据,即stride=2。
zero-padding = 1。
然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。
ps:filter w1 也是同理的计算过程。
左边是输入(7*7*3中,7*7代表图像的像素、长宽,3代表R、G、B 三个颜色通道);
中间部分是两个不同的滤波器Filter w0、Filter w1;
最右边则是两个不同的输出(有两个filter,就有两个输出);
随着左边数据窗口的平移滑动,滤波器Filter w0 和Filter w1对不同的局部数据进行卷积计算。
左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。
数据窗口滑动,导致输入在变化,但中间滤波器Filter的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。
例如人看周围的世界,所看到的信息在变,但采集信息的双眼不变。但,不同人的双眼看同一个局部地方所感受到的信息不同,所以不同的滤波器就像不同的双眼,会得到不同结果。
接下来,我们细究每一步的具体计算过程。
上图中的第一步,输出结果1,具体是怎么计算得到的呢?
数据窗口1:
filter w0(1):
计算如下:
1*0 + 1*0 + (-1)*0
+
-1*0 + 0*0 + 1*1
+
-1*0 +-1*0 + 0*1
+
数据窗口2:
filter w0(2):
-1*0 + 0*0 + -1*0
+
0*0 + 0*1 + -1*1
+
1*0 + -1*0 + 0*2
+
数据窗口3:
filter w0(3):
0*0 + 1*0 + 0*0
+
1*0 + 0*2 + 1*0
+
0*0 + -1*0 +1*0
+
偏置量:1
= 1
然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果。
最后,换另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。
OK,卷积计算就是这么的简单。
4. 池化(pool)层
池化,简言之,即取区域平均或最大。它的功能是逐步减少图像的大小来减少网络中的参数和计算量。就是对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。
平均池在历史上被使用,但在实际中证实,最大池,效果更好。所以现在池化都去最大值。
如图:
上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。
四、矩阵运算
1、矩阵加、减法
设矩阵
则
简言之,两个矩阵相加减,即它们相同位置的元素相加减!注意:只有对于两个行数、列数分别相等的矩阵(即同型矩阵),加减法运算才有意义,即加减运算是可行的.
2、矩阵乘法
2.1 矩阵与数的乘法:
五、参考文章
参考:
http://cs231n.github.io/convolutional-networks/#overview
http://blog.csdn.net/yjl9122/article/details/70198357
http://www.csdn.net/article/2015-03-24/2824301
http://blog.csdn.net/loving_forever_/article/details/52389862
http://www2.edu-edu.com.cn/lesson_crs78/self/j_0022/soft/ch0605.html
http://www2.edu-edu.com.cn/lesson_crs78/self/j_0022/soft/ch0605.html
https://www.zhihu.com/question/22334626/answer/21036590
http://blog.csdn.net/loving_forever_/article/details/52389862
http://blog.csdn.net/real_myth/article/details/51824193
https://www.zhihu.com/question/22334626
完毕。