㈠ 卷积神经网络的 卷积层、激活层、池化层、全连接层
数据输入的是一张图片(输入层),CONV表示卷积层,RELU表示激励层,POOL表示池化层,Fc表示全连接层
全连接神经网络需要非常多的计算资源才能支撑它来做反向传播和前向传播,所以说全连接神经网络可以存储非常多的参数,如果你给它的样本如果没有达到它的量级的时候,它可以轻轻松松把你给他的样本全部都记下来,这会出现过拟合的情况。
所以我们应该把神经元和神经元之间的连接的权重个数降下来,但是降下来我们又不能保证它有较强的学习能力,所以这是一个纠结的地方,所以有一个方法就是 局部连接+权值共享 ,局部连接+权值共享不仅权重参数降下来了,而且学习能力并没有实质的降低,除此之外还有其它的好处,下来看一下,下面的这几张图片:
一个图像的不同表示方式
这几张图片描述的都是一个东西,但是有的大有的小,有的靠左边,有的靠右边,有的位置不同,但是我们构建的网络识别这些东西的时候应该是同一结果。为了能够达到这个目的,我们可以让图片的不同位置具有相同的权重(权值共享),也就是上面所有的图片,我们只需要在训练集中放一张,我们的神经网络就可以识别出上面所有的,这也是 权值共享 的好处。
而卷积神经网络就是局部连接+权值共享的神经网络。
现在我们对卷积神经网络有一个初步认识了,下面具体来讲解一下卷积神经网络,卷积神经网络依旧是层级结构,但层的功能和形式做了改变,卷积神经网络常用来处理图片数据,比如识别一辆汽车:
在图片输出到神经网络之前,常常先进行图像处理,有 三种 常见的图像的处理方式:
均值化和归一化
去相关和白化
图片有一个性质叫做局部关联性质,一个图片的像素点影响最大的是它周边的像素点,而距离这个像素点比较远的像素点二者之间关系不大。这个性质意味着每一个神经元我们不用处理全局的图片了(和上一层全连接),我们的每一个神经元只需要和上一层局部连接,相当于每一个神经元扫描一小区域,然后许多神经元(这些神经元权值共享)合起来就相当于扫描了全局,这样就构成一个特征图,n个特征图就提取了这个图片的n维特征,每个特征图是由很多神经元来完成的。
在卷积神经网络中,我们先选择一个局部区域(filter),用这个局部区域(filter)去扫描整张图片。 局部区域所圈起来的所有节点会被连接到下一层的 一个节点上 。我们拿灰度图(只有一维)来举例:
局部区域
图片是矩阵式的,将这些以矩阵排列的节点展成了向量。就能更好的看出来卷积层和输入层之间的连接,并不是全连接的,我们将上图中的红色方框称为filter,它是2*2的,这是它的尺寸,这不是固定的,我们可以指定它的尺寸。
我们可以看出来当前filter是2*2的小窗口,这个小窗口会将图片矩阵从左上角滑到右下角,每滑一次就会一下子圈起来四个,连接到下一层的一个神经元,然后产生四个权重,这四个权重(w1、w2、w3、w4)构成的矩阵就叫做卷积核。
卷积核是算法自己学习得到的,它会和上一层计算,比如,第二层的0节点的数值就是局部区域的线性组合(w1 0+w2 1+w3 4+w4 5),即被圈中节点的数值乘以对应的权重后相加。
卷积核计算
卷积操作
我们前面说过图片不用向量表示是为了保留图片平面结构的信息。 同样的,卷积后的输出若用上图的向量排列方式则丢失了平面结构信息。 所以我们依然用矩阵的方式排列它们,就得到了下图所展示的连接,每一个蓝色结点连接四个黄色的结点。
卷积层的连接方式
图片是一个矩阵然后卷积神经网络的下一层也是一个矩阵,我们用一个卷积核从图片矩阵左上角到右下角滑动,每滑动一次,当然被圈起来的神经元们就会连接下一层的一个神经元,形成参数矩阵这个就是卷积核,每次滑动虽然圈起来的神经元不同,连接下一层的神经元也不同,但是产生的参数矩阵确是一样的,这就是 权值共享 。
卷积核会和扫描的图片的那个局部矩阵作用产生一个值,比如第一次的时候,(w1 0+w2 1+w3 4+w4 5),所以,filter从左上到右下的这个过程中会得到一个矩阵(这就是下一层也是一个矩阵的原因),具体过程如下所示:
卷积计算过程
上图中左边是图矩阵,我们使用的filter的大小是3 3的,第一次滑动的时候,卷积核和图片矩阵作用(1 1+1 0+1 1+0 0+1 1+1 0+0 1+0 0+1 1)=4,会产生一个值,这个值就是右边矩阵的第一个值,filter滑动9次之后,会产生9个值,也就是说下一层有9个神经元,这9个神经元产生的值就构成了一个矩阵,这矩阵叫做特征图,表示image的某一维度的特征,当然具体哪一维度可能并不知道,可能是这个图像的颜色,也有可能是这个图像的轮廓等等。
单通道图片总结 :以上就是单通道的图片的卷积处理,图片是一个矩阵,我们用指定大小的卷积核从左上角到右下角来滑动,每次滑动所圈起来的结点会和下一层的一个结点相连,连接之后就会形成局部连接,每一条连接都会产生权重,这些权重就是卷积核,所以每次滑动都会产生一个卷积核,因为权值共享,所以这些卷积核都是一样的。卷积核会不断和当时卷积核所圈起来的局部矩阵作用,每次产生的值就是下一层结点的值了,这样多次产生的值组合起来就是一个特征图,表示某一维度的特征。也就是从左上滑动到右下这一过程中会形成一个特征图矩阵(共享一个卷积核),再从左上滑动到右下又会形成另一个特征图矩阵(共享另一个卷积核),这些特征图都是表示特征的某一维度。
三个通道的图片如何进行卷积操作?
至此我们应该已经知道了单通道的灰度图是如何处理的,实际上我们的图片都是RGB的图像,有三个通道,那么此时图像是如何卷积的呢?
彩色图像
filter窗口滑的时候,我们只是从width和height的角度来滑动的,并没有考虑depth,所以每滑动一次实际上是产生一个卷积核,共享这一个卷积核,而现在depth=3了,所以每滑动一次实际上产生了具有三个通道的卷积核(它们分别作用于输入图片的蓝色、绿色、红色通道),卷积核的一个通道核蓝色的矩阵作用产生一个值,另一个和绿色的矩阵作用产生一个值,最后一个和红色的矩阵作用产生一个值,然后这些值加起来就是下一层结点的值,结果也是一个矩阵,也就是一张特征图。
三通道的计算过程
要想有多张特征图的话,我们可以再用新的卷积核来进行左上到右下的滑动,这样就会形成 新的特征图 。
三通道图片的卷积过程
也就是说增加一个卷积核,就会产生一个特征图,总的来说就是输入图片有多少通道,我们的卷积核就需要对应多少通道,而本层中卷积核有多少个,就会产生多少个特征图。这样卷积后输出可以作为新的输入送入另一个卷积层中处理,有几个特征图那么depth就是几,那么下一层的每一个特征图就得用相应的通道的卷积核来对应处理,这个逻辑要清楚,我们需要先了解一下 基本的概念:
卷积计算的公式
4x4的图片在边缘Zero padding一圈后,再用3x3的filter卷积后,得到的Feature Map尺寸依然是4x4不变。
填充
当然也可以使用5x5的filte和2的zero padding可以保持图片的原始尺寸,3x3的filter考虑到了像素与其距离为1以内的所有其他像素的关系,而5x5则是考虑像素与其距离为2以内的所有其他像素的关系。
规律: Feature Map的尺寸等于
(input_size + 2 * padding_size − filter_size)/stride+1
我们可以把卷积层的作用 总结一点: 卷积层其实就是在提取特征,卷积层中最重要的是卷积核(训练出来的),不同的卷积核可以探测特定的形状、颜色、对比度等,然后特征图保持了抓取后的空间结构,所以不同卷积核对应的特征图表示某一维度的特征,具体什么特征可能我们并不知道。特征图作为输入再被卷积的话,可以则可以由此探测到"更大"的形状概念,也就是说随着卷积神经网络层数的增加,特征提取的越来越具体化。
激励层的作用可以理解为把卷积层的结果做 非线性映射 。
激励层
上图中的f表示激励函数,常用的激励函数几下几种:
常用的激励函数
我们先来看一下激励函数Sigmoid导数最小为0,最大为1/4,
激励函数Sigmoid
Tanh激活函数:和sigmoid相似,它会关于x轴上下对应,不至于朝某一方面偏向
Tanh激活函数
ReLU激活函数(修正线性单元):收敛快,求梯度快,但较脆弱,左边的梯度为0
ReLU激活函数
Leaky ReLU激活函数:不会饱和或者挂掉,计算也很快,但是计算量比较大
Leaky ReLU激活函数
一些激励函数的使用技巧 :一般不要用sigmoid,首先试RELU,因为快,但要小心点,如果RELU失效,请用Leaky ReLU,某些情况下tanh倒是有不错的结果。
这就是卷积神经网络的激励层,它就是将卷积层的线性计算的结果进行了非线性映射。可以从下面的图中理解。它展示的是将非线性操作应用到一个特征图中。这里的输出特征图也可以看作是"修正"过的特征图。如下所示:
非线性操作
池化层:降低了各个特征图的维度,但可以保持大分重要的信息。池化层夹在连续的卷积层中间,压缩数据和参数的量,减小过拟合,池化层并没有参数,它只不过是把上层给它的结果做了一个下采样(数据压缩)。下采样有 两种 常用的方式:
Max pooling :选取最大的,我们定义一个空间邻域(比如,2x2 的窗口),并从窗口内的修正特征图中取出最大的元素,最大池化被证明效果更好一些。
Average pooling :平均的,我们定义一个空间邻域(比如,2x2 的窗口),并从窗口内的修正特征图算出平均值
Max pooling
我们要注意一点的是:pooling在不同的depth上是分开执行的,也就是depth=5的话,pooling进行5次,产生5个池化后的矩阵,池化不需要参数控制。池化操作是分开应用到各个特征图的,我们可以从五个输入图中得到五个输出图。
池化操作
无论是max pool还是average pool都有分信息被舍弃,那么部分信息被舍弃后会损坏识别结果吗?
因为卷积后的Feature Map中有对于识别物体不必要的冗余信息,我们下采样就是为了去掉这些冗余信息,所以并不会损坏识别结果。
我们来看一下卷积之后的冗余信息是怎么产生的?
我们知道卷积核就是为了找到特定维度的信息,比如说某个形状,但是图像中并不会任何地方都出现这个形状,但卷积核在卷积过程中没有出现特定形状的图片位置卷积也会产生一个值,但是这个值的意义就不是很大了,所以我们使用池化层的作用,将这个值去掉的话,自然也不会损害识别结果了。
比如下图中,假如卷积核探测"横折"这个形状。 卷积后得到3x3的Feature Map中,真正有用的就是数字为3的那个节点,其余数值对于这个任务而言都是无关的。 所以用3x3的Max pooling后,并没有对"横折"的探测产生影响。 试想在这里例子中如果不使用Max pooling,而让网络自己去学习。 网络也会去学习与Max pooling近似效果的权重。因为是近似效果,增加了更多的参数的代价,却还不如直接进行最大池化处理。
最大池化处理
在全连接层中所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。当前面卷积层抓取到足以用来识别图片的特征后,接下来的就是如何进行分类。 通常卷积网络的最后会将末端得到的长方体平摊成一个长长的向量,并送入全连接层配合输出层进行分类。比如,在下面图中我们进行的图像分类为四分类问题,所以卷积神经网络的输出层就会有四个神经元。
四分类问题
我们从卷积神经网络的输入层、卷积层、激活层、池化层以及全连接层来讲解卷积神经网络,我们可以认为全连接层之间的在做特征提取,而全连接层在做分类,这就是卷积神经网络的核心。
㈡ 为什么当神经元结点和层数增加时,全连接深度神经网络训练权值很困难
节点越多参数量越大
层数越多模型越复杂
困难倒没多困难,就是计算量大点
㈢ Tensorflow系列3:多层神经网络--解决非线性问题
这里拿医院的数据做一个简单的线性分类任务,任务特征是病人的年龄和肿瘤大小,任务目标是病人的肿瘤是良性的还是恶性的。
补充知识:
补充知识:
MSE 的公式为:
cross entropy 一般用于分类问题,表达的意思是样本属于某一类的概率,公式为:
这里用于计算的a也是经过分布统一化处理的(或者是经过Sigmoid函数激活的结果),取值范围在0~1之间。
在tensorflow中常见的交叉熵函数有:Sgimoid交叉熵,softmax交叉熵,Sparse交叉熵,加权Sgimoid交叉熵
MSE的预测值和真实值要控制在同样的数据分布内,假设预测值经过Sigmoid激活函数得到取值范围时候0 1之间,那么真实值也要归一化成0 1之间。
在tensorflow中没有单独的MSE函数,可以自己组合:
MSE=tf.rece_mean(tf.square(logits-outputs))
softmax_cross_entropy_with_logits 函数,必须要自己定义,比如:
loss = tf.rece_mean(-tf.rece_sum(labels*tf.log(logits_scaled),1))
损失函数的选取取决于输入标签数据的类型:如果输入是实数、无界的值,多使用MSE;如果输入标签是位矢量(分类标志),使用cross entropy比较合适
补充知识点:
reshape() 函数接受-1时,该行(列)数可以为任意值。[-1,1]代表行数随意,列数变成1。
模型生成的z用公式可以表示成z=x1w1+x2w2+b,如果将x1和x2映射到直角坐标系中的x和y坐标,那么z就可以被分为小于0和大于0两部分。当z=0时,就代表直线本身。
这次再在刚刚的二分类基础上再增加一类,变成三类,可以使用多条直线将数据分成多类。
生成的X,Y的数据样本如下内容:
常用的激活函数比如sigmoid,relu,tanh输出值只有两种,面对以上多分类问题,就需要使用softmax算法。该算法的主要应用就是多分类,而且是互斥的,即只能属于某一类。(对于不是互斥的分类问题,一般使用多个二分类来组成)
补充知识:
也可以画出更直观的图示:
例如:
对于线性不可分的数据样本,可以使用多层神经网络来解决,也就是在输入层和输出层中间多加一些神经元,每一层可以加多个,也可以加多层。
在模型训练过程中会出现欠拟合和过拟合的问题,欠拟合的原因并不是模型不行,而是我们的学习方法无法更精准地学习到适合的模型参数。模型越薄弱,对训练的要求就越高,但是可以采用增加节点或者增加隐藏层的方式,让模型具有更高的拟合性,从而降低模型的训练难度。过拟合的表现在模型在训练集上的表现非常好,loss很小;但是在测试集上的表现却非常差。
避免过拟合的方法很多:常用的有early stopping、数据集扩增、正则化、dropout
本质就是加入噪声,在计算loss时,在损失后面再加上意向,这样预测结果与标签间的误差就会受到干扰,导致学习参数W和b无法按照目标方向来调整,从而实现模型与训练数据无法完全拟合的效果,从而防止过拟合。
这个添加的干扰项必须具有如下特性:
这里有两个范数L1和L2:
tf.rece_sum(tf.abs(w))
tf.nn.l2_loss(t,name=None)
拿上面的异或数据做举例,dropout方法就是在刚刚的layer_1层后面再添加一个dropout层。
实际训练时,将keep_prob设置成0.6,意味着每次训练将仅允许0.6的节点参与学习运算。由于学习速度这样就变慢了,可以将learning_rate调大,加快训练速度。 注意:在测试时,需要将keep_prob设置为1。
全连接神经网络是一个通用的拟合数据的框架,只要有足够多的神经元,及时只有一层hidden layer,利用常见的Sigmoid,relu等激活函数,就可以无限逼近任何连续函数。在实际使用中,如果想利用浅层神经网络拟合复杂非线性函数,就需要你靠增加的神经元个数来实现,神经元过多会造成参数过多,从而增加网络的学习难度,并影响网络的泛化能力。因此,在实际构建网络结构时,一般倾向于使用更深的模型,开减少所需要的神经元数量。
㈣ 神经网络:卷积神经网络(CNN)
神经网络 最早是由心理学家和神经学家提出的,旨在寻求开发和测试神经的计算模拟。
粗略地说, 神经网络 是一组连接的 输入/输出单元 ,其中每个连接都与一个 权 相关联。在学习阶段,通过调整权值,使得神经网络的预测准确性逐步提高。由于单元之间的连接,神经网络学习又称 连接者学习。
神经网络是以模拟人脑神经元的数学模型为基础而建立的,它由一系列神经元组成,单元之间彼此连接。从信息处理角度看,神经元可以看作是一个多输入单输出的信息处理单元,根据神经元的特性和功能,可以把神经元抽象成一个简单的数学模型。
神经网络有三个要素: 拓扑结构、连接方式、学习规则
神经网络的拓扑结构 :神经网络的单元通常按照层次排列,根据网络的层次数,可以将神经网络分为单层神经网络、两层神经网络、三层神经网络等。结构简单的神经网络,在学习时收敛的速度快,但准确度低。
神经网络的层数和每层的单元数由问题的复杂程度而定。问题越复杂,神经网络的层数就越多。例如,两层神经网络常用来解决线性问题,而多层网络就可以解决多元非线性问题
神经网络的连接 :包括层次之间的连接和每一层内部的连接,连接的强度用权来表示。
根据层次之间的连接方式,分为:
1)前馈式网络:连接是单向的,上层单元的输出是下层单元的输入,如反向传播网络,Kohonen网络
2)反馈式网络:除了单项的连接外,还把最后一层单元的输出作为第一层单元的输入,如Hopfield网络
根据连接的范围,分为:
1)全连接神经网络:每个单元和相邻层上的所有单元相连
2)局部连接网络:每个单元只和相邻层上的部分单元相连
神经网络的学习
根据学习方法分:
感知器:有监督的学习方法,训练样本的类别是已知的,并在学习的过程中指导模型的训练
认知器:无监督的学习方法,训练样本类别未知,各单元通过竞争学习。
根据学习时间分:
离线网络:学习过程和使用过程是独立的
在线网络:学习过程和使用过程是同时进行的
根据学习规则分:
相关学习网络:根据连接间的激活水平改变权系数
纠错学习网络:根据输出单元的外部反馈改变权系数
自组织学习网络:对输入进行自适应地学习
摘自《数学之美》对人工神经网络的通俗理解:
神经网络种类很多,常用的有如下四种:
1)Hopfield网络,典型的反馈网络,结构单层,有相同的单元组成
2)反向传播网络,前馈网络,结构多层,采用最小均方差的纠错学习规则,常用于语言识别和分类等问题
3)Kohonen网络:典型的自组织网络,由输入层和输出层构成,全连接
4)ART网络:自组织网络
深度神经网络:
Convolutional Neural Networks(CNN)卷积神经网络
Recurrent neural Network(RNN)循环神经网络
Deep Belief Networks(DBN)深度信念网络
深度学习是指多层神经网络上运用各种机器学习算法解决图像,文本等各种问题的算法集合。深度学习从大类上可以归入神经网络,不过在具体实现上有许多变化。
深度学习的核心是特征学习,旨在通过分层网络获取分层次的特征信息,从而解决以往需要人工设计特征的重要难题。
Machine Learning vs. Deep Learning
神经网络(主要是感知器)经常用于 分类
神经网络的分类知识体现在网络连接上,被隐式地存储在连接的权值中。
神经网络的学习就是通过迭代算法,对权值逐步修改的优化过程,学习的目标就是通过改变权值使训练集的样本都能被正确分类。
神经网络特别适用于下列情况的分类问题:
1) 数据量比较小,缺少足够的样本建立模型
2) 数据的结构难以用传统的统计方法来描述
3) 分类模型难以表示为传统的统计模型
缺点:
1) 需要很长的训练时间,因而对于有足够长训练时间的应用更合适。
2) 需要大量的参数,这些通常主要靠经验确定,如网络拓扑或“结构”。
3) 可解释性差 。该特点使得神经网络在数据挖掘的初期并不看好。
优点:
1) 分类的准确度高
2)并行分布处理能力强
3)分布存储及学习能力高
4)对噪音数据有很强的鲁棒性和容错能力
最流行的基于神经网络的分类算法是80年代提出的 后向传播算法 。后向传播算法在多路前馈神经网络上学习。
定义网络拓扑
在开始训练之前,用户必须说明输入层的单元数、隐藏层数(如果多于一层)、每一隐藏层的单元数和输出层的单元数,以确定网络拓扑。
对训练样本中每个属性的值进行规格化将有助于加快学习过程。通常,对输入值规格化,使得它们落入0.0和1.0之间。
离散值属性可以重新编码,使得每个域值一个输入单元。例如,如果属性A的定义域为(a0,a1,a2),则可以分配三个输入单元表示A。即,我们可以用I0 ,I1 ,I2作为输入单元。每个单元初始化为0。如果A = a0,则I0置为1;如果A = a1,I1置1;如此下去。
一个输出单元可以用来表示两个类(值1代表一个类,而值0代表另一个)。如果多于两个类,则每个类使用一个输出单元。
隐藏层单元数设多少个“最好” ,没有明确的规则。
网络设计是一个实验过程,并可能影响准确性。权的初值也可能影响准确性。如果某个经过训练的网络的准确率太低,则通常需要采用不同的网络拓扑或使用不同的初始权值,重复进行训练。
后向传播算法学习过程:
迭代地处理一组训练样本,将每个样本的网络预测与实际的类标号比较。
每次迭代后,修改权值,使得网络预测和实际类之间的均方差最小。
这种修改“后向”进行。即,由输出层,经由每个隐藏层,到第一个隐藏层(因此称作后向传播)。尽管不能保证,一般地,权将最终收敛,学习过程停止。
算法终止条件:训练集中被正确分类的样本达到一定的比例,或者权系数趋近稳定。
后向传播算法分为如下几步:
1) 初始化权
网络的权通常被初始化为很小的随机数(例如,范围从-1.0到1.0,或从-0.5到0.5)。
每个单元都设有一个偏置(bias),偏置也被初始化为小随机数。
2) 向前传播输入
对于每一个样本X,重复下面两步:
向前传播输入,向后传播误差
计算各层每个单元的输入和输出。输入层:输出=输入=样本X的属性;即,对于单元j,Oj = Ij = Xj。隐藏层和输出层:输入=前一层的输出的线性组合,即,对于单元j, Ij =wij Oi + θj,输出=
3) 向后传播误差
计算各层每个单元的误差。
输出层单元j,误差:
Oj是单元j的实际输出,而Tj是j的真正输出。
隐藏层单元j,误差:
wjk是由j到下一层中单元k的连接的权,Errk是单元k的误差
更新 权 和 偏差 ,以反映传播的误差。
权由下式更新:
其中,△wij是权wij的改变。l是学习率,通常取0和1之间的值。
偏置由下式更新:
其中,△θj是偏置θj的改变。
Example
人类视觉原理:
深度学习的许多研究成果,离不开对大脑认知原理的研究,尤其是视觉原理的研究。1981 年的诺贝尔医学奖,颁发给了 David Hubel(出生于加拿大的美国神经生物学家) 和Torsten Wiesel,以及Roger Sperry。前两位的主要贡献,是“发现了视觉系统的信息处理”, 可视皮层是分级的 。
人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。
对于不同的物体,人类视觉也是通过这样逐层分级,来进行认知的:
在最底层特征基本上是类似的,就是各种边缘,越往上,越能提取出此类物体的一些特征(轮子、眼睛、躯干等),到最上层,不同的高级特征最终组合成相应的图像,从而能够让人类准确的区分不同的物体。
可以很自然的想到:可以不可以模仿人类大脑的这个特点,构造多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类呢?答案是肯定的,这也是许多深度学习算法(包括CNN)的灵感来源。
卷积神经网络是一种多层神经网络,擅长处理图像特别是大图像的相关机器学习问题。卷积网络通过一系列方法,成功将数据量庞大的图像识别问题不断降维,最终使其能够被训练。
CNN最早由Yann LeCun提出并应用在手写字体识别上。LeCun提出的网络称为LeNet,其网络结构如下:
这是一个最典型的卷积网络,由 卷积层、池化层、全连接层 组成。其中卷积层与池化层配合,组成多个卷积组,逐层提取特征,最终通过若干个全连接层完成分类。
CNN通过卷积来模拟特征区分,并且通过卷积的权值共享及池化,来降低网络参数的数量级,最后通过传统神经网络完成分类等任务。
降低参数量级:如果使用传统神经网络方式,对一张图片进行分类,那么,把图片的每个像素都连接到隐藏层节点上,对于一张1000x1000像素的图片,如果有1M隐藏层单元,一共有10^12个参数,这显然是不能接受的。
但是在CNN里,可以大大减少参数个数,基于以下两个假设:
1)最底层特征都是局部性的,也就是说,用10x10这样大小的过滤器就能表示边缘等底层特征
2)图像上不同小片段,以及不同图像上的小片段的特征是类似的,也就是说,能用同样的一组分类器来描述各种各样不同的图像
基于以上两个假设,就能把第一层网络结构简化
用100个10x10的小过滤器,就能够描述整幅图片上的底层特征。
卷积运算的定义如下图所示:
如上图所示,一个5x5的图像,用一个3x3的 卷积核 :
101
010
101
来对图像进行卷积操作(可以理解为有一个滑动窗口,把卷积核与对应的图像像素做乘积然后求和),得到了3x3的卷积结果。
这个过程可以理解为使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值。在实际训练过程中, 卷积核的值是在学习过程中学到的。
在具体应用中,往往有多个卷积核,可以认为, 每个卷积核代表了一种图像模式 ,如果某个图像块与此卷积核卷积出的值大,则认为此图像块十分接近于此卷积核。如果设计了6个卷积核,可以理解为这个图像上有6种底层纹理模式,也就是用6种基础模式就能描绘出一副图像。以下就是24种不同的卷积核的示例:
池化 的过程如下图所示:
可以看到,原始图片是20x20的,对其进行采样,采样窗口为10x10,最终将其采样成为一个2x2大小的特征图。
之所以这么做,是因为即使做完了卷积,图像仍然很大(因为卷积核比较小),所以为了降低数据维度,就进行采样。
即使减少了许多数据,特征的统计属性仍能够描述图像,而且由于降低了数据维度,有效地避免了过拟合。
在实际应用中,分为最大值采样(Max-Pooling)与平均值采样(Mean-Pooling)。
LeNet网络结构:
注意,上图中S2与C3的连接方式并不是全连接,而是部分连接。最后,通过全连接层C5、F6得到10个输出,对应10个数字的概率。
卷积神经网络的训练过程与传统神经网络类似,也是参照了反向传播算法
第一阶段,向前传播阶段:
a)从样本集中取一个样本(X,Yp),将X输入网络;
b)计算相应的实际输出Op
第二阶段,向后传播阶段
a)计算实际输出Op与相应的理想输出Yp的差;
b)按极小化误差的方法反向传播调整权矩阵。
㈤ 什么是全连接神经网络怎么理解“全连接”
1、全连接神经网络解析:对n-1层和n层而言,n-1层的任意一个节点,都和第n层所有节点有连接。即第n层的每个节点在进行计算的时候,激活函数的输入是n-1层所有节点的加权。
2、全连接的神经网络示意图:
3、“全连接”是一种不错的模式,但是网络很大的时候,训练速度回很慢。部分连接就是认为的切断某两个节点直接的连接,这样训练时计算量大大减小。
㈥ 深度神经网络是如何训练的
Coursera的Ng机器学习,UFLDL都看过。没记错的话Ng的机器学习里是直接给出公式了,虽然你可能知道如何求解,但是即使不知道完成作业也不是问题,只要照着公式写就行。反正我当时看的时候心里并没能比较清楚的明白。我觉得想了解深度学习UFLDL教程 - Ufldl是不错的。有习题,做完的话确实会对深度学习有更加深刻的理解,但是总还不是很清晰。后来看了Li FeiFei的Stanford University CS231n: Convolutional Neural Networks for Visual Recognition,我的感觉是对CNN的理解有了很大的提升。沉下心来推推公式,多思考,明白了反向传播本质上是链式法则(虽然之前也知道,但是当时还是理解的迷迷糊糊的)。所有的梯度其实都是对最终的loss进行求导得到的,也就是标量对矩阵or向量的求导。当然同时也学到了许多其他的关于cnn的。并且建议你不仅要完成练习,最好能自己也写一个cnn,这个过程可能会让你学习到许多更加细节和可能忽略的东西。这样的网络可以使用中间层构建出多层的抽象,正如我们在布尔线路中做的那样。例如,如果我们在进行视觉模式识别,那么在第一层的神经元可能学会识别边,在第二层的神经元可以在边的基础上学会识别出更加复杂的形状,例如三角形或者矩形。第三层将能够识别更加复杂的形状。依此类推。这些多层的抽象看起来能够赋予深度网络一种学习解决复杂模式识别问题的能力。然后,正如线路的示例中看到的那样,存在着理论上的研究结果告诉我们深度网络在本质上比浅层网络更加强大。
㈦ 为什么全连接神经网络在图像识别中不如卷积神经网络
输入数据是n*n的像素矩阵,再使用全连接神经网络,那么参数的个数会是指数级的增长,需要训练的数据太多。
而CNN的话,可以通过共享同一个参数,来提取特定方向上的特征,所以训练量将比全连接神经网络小了很多。
㈧ 神经网络训练时为什么用224*224的图像块
已经过了两年了。。。。
感觉灶逗裤你现在应该明白了,所以我只是说一下我自己的理解就当作是一种探讨和交流把,其实图片的尺寸对于卷积conv和池化pool来说是没有要求的,但是在早期,我们没有空间金字塔池化之前(spp)我们采取的神经网路的做法是n个卷积和x个池化最后跟着全连隐简接,由于全连接是固定大小的也就是说全连接的参数是一定的,这就需要确保前面指清的size或者所到全连接之前的feature map的大小是需要固定的,从最底层向上一直推导到input层,那么图片的大小也就是一定的了,不是说一定要用这个size的,其实你只要将最后的全连接改了,什么size都可以了。
㈨ Keras快速构建神经网络模型
用Keras搭建神经网络的步骤:
深度学习框架Keras——像搭积木般构建神经网络,主要分为7个部分,每个部分只需要几个keras API函数就能实现,用户即可像搭积木般一层层构建神经网络模型。
1. 创建模型 Create model
2. 添加层级 Add Layer
3. 模型编译 Compile
4. 数据填充 Fit
5. 模型评估 Evaluate
6. 模型预测 Predict
7. 模型保存 Save model
下面章节会对每一部分具体来介绍。。。
Keras 中主要有三类模型:Sequential model, Functional model, Subclass model
在开始创建模型之前,首先需要引入tensorflow和keras模块,然后再创建一个Sequential model
Sequential API定义如下:
layers参数可以为空, 然后通过add method向模型中添加layer,相对应的通过pop method移除模型中layer。
创建Function API模型,可以调用Keras.Model来指定多输入多数出。
Keras.Model定义:
Layers是神经网络基本构建块。一个Layer包含了tensor-in/tensor-out的计算方法和一些状态,并保存在TensorFlow变量中(即layers的权重weights)。
Layers主要分为6个类别,基础层,核心层,卷基层,池化层,循环层,融合层。
对派生类的实现可以用以下方法:
** init (): 定义layer的属性,创建layer的静态变量。
** build(self, input_shape): 创建依赖于输入的变量,可以调用add_weight()。
** call(self, *args, **kwargs): 在确保已调用build()之后,在 call 中调用。
** get_config(self): 返回包含用于初始化此层的配置的字典类型。
创建SimpleDense派生类,在build()函数里添加trainable weights。实现y=input*w +b
结果输出:
创建ComputeSum派生类,在 init 函数里添加 non-trainable weights。实现输入矩阵沿轴0元素相加后,x=x+self.total
结果输出:
核心层是最常用的层,涉及到数据的转换和处理的时候都会用到这些层。
Dense层就是所谓的全连接神经网络层,简称全连接层。全连接层中的每个神经元与其前一层的所有神经元进行全连接。
Dense 实现以下操作: output = activation(dot(input, kernel) + bias) 其中 activation 是按逐个元素计算的激活函数,kernel 是由网络层创建的权值矩阵,以及 bias 是其创建的偏置向量 (只在 use_bias 为 True 时才有用)。
将激活函数应用于输出。输入信号进入神经元后进行的运算处理。
sigmoid、tanh、ReLU、softplus的对比曲线如下图所示:
激活函数可以通过设置单独的激活层Activation实现,也可以在构造层对象时通过传递 activation 参数实现:
Dropout在训练中每次更新时,将输入单元的按比率随机设置为0,这有助于防止过拟合。未设置为0的输入将按1 /(1-rate)放大,以使所有输入的总和不变。
请注意,仅当训练设置为True时才应用Dropout层,以便在推理过程中不会丢弃任何值。 使用model.fit时,训练将自动适当地设置为True。
将输入展平。不影响批量大小。注意:如果输入的形状是(batch,)没有特征轴,则展平会增加通道尺寸,而输出的形状是(batch, 1)。
将输入重新调整为特定的尺寸
将任意表达式封装为Layer对象。在Lambda层,以便在构造模型时可以使用任意TensorFlow函数。 Lambda层最适合简单操作或快速实验。 Lambda层是通过序列化Python字节码来保存的。
使用覆盖值覆盖序列,以跳过时间步。
对于输入张量的每一个时间步(张量的第一个维度),如果所有时间步中输入张量的值与mask_value相等,则将在所有下游层中屏蔽(跳过)该时间步。如果任何下游层不支持覆盖但仍然收到此类输入覆盖信息,会引发异常。
举例说明:
Embedding 是一个将离散变量转为连续向量表示的一个方式。该层只能用作模型中的第一层。
Embedding 有以下3个主要目的: 在 embedding 空间中查找最近邻,这可以很好的用于根据用户的兴趣来进行推荐。 作为监督性学习任务的输入。 用于可视化不同离散变量之间的关系.
举例说明:
输出结果:
由维基网络的介绍我们可以得知,卷积是一种定义在两个函数(𝑓跟𝑔)上的数学操作,旨在产生一个新的函数。那么𝑓和𝑔的卷积就可以写成𝑓∗𝑔,数学定义如下:
对应到不同方面,卷积可以有不同的解释:𝑔 既可以看作我们在深度学习里常说的核(Kernel),也可以对应到信号处理中的滤波器(Filter)。而 𝑓 可以是我们所说的机器学习中的特征(Feature),也可以是信号处理中的信号(Signal)。f和g的卷积 (𝑓∗𝑔)就可以看作是对𝑓的加权求和。
一维时域卷积操作:
二维图像卷积操作:
卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。
一维卷积层(即时域卷积),用以在一维输入信号上进行邻域滤波。
举例说明:
结果输出:
2D 卷积层 (例如对图像的空间卷积)。
举例说明:
结果输出:
3D卷积层(例如体积上的空间卷积)
举例说明:
结果输出:
深度可分离1D卷积。该层执行分别作用在通道上的深度卷积,然后是混合通道的逐点卷积。 如果use_bias为True并提供了一个偏差初始值设定项,则它将偏差向量添加到输出中。 然后,它可选地应用激活函数以产生最终输出。
深度可分离的2D卷积。可分离的卷积包括首先执行深度空间卷积(它分别作用于每个输入通道),然后是点向卷积,它将混合所得的输出通道。 depth_multiplier参数控制在深度步骤中每个输入通道生成多少个输出通道。
直观上,可分离的卷积可以理解为将卷积内核分解为两个较小内核的一种方式,或者是Inception块的一种极端版本。
转置卷积层 (有时被成为反卷积)。对转置卷积的需求一般来自希望使用 与正常卷积相反方向的变换,将具有卷积输出尺寸的东西 转换为具有卷积输入尺寸的东西, 同时保持与所述卷积相容的连通性模式。
池化层是模仿人的视觉系统对数据进行降维,用更高层次的特征表示图像。实施池化的目的:降低信息冗余;提升模型的尺度不变性、旋转不变性。 防止过拟合。
通常有最大池化层,平均池化层。
池化层有三种形态:1D 用于一维数据,2D 一般用于二维图像数据,3D 带时间序列数据的图像数据
循环神经网络(Recurrent Neural Network, 简称 RNN),循环神经网络的提出便是基于记忆模型的想法,期望网络能够记住前面出现的特征,并依据特征推断后面的结果,而且整体的网络结构不断循环,因此得名为循环神经网络。
长短期记忆网络(Long-Short Term Memory, LSTM )论文首次发表于1997年。由于独特的设计结构,LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。
举例说明:
结果输出:
GRU 门控循环单元- Cho et al. 2014.
在LSTM中引入了三个门函数:输入门、遗忘门和输出门来控制输入值、记忆值和输出值。而在GRU模型中只有两个门:分别是更新门和重置门。与LSTM相比,GRU内部少了一个”门控“,参数比LSTM少,但是却也能够达到与LSTM相当的功能。考虑到硬件的计算能力和时间成本,因而很多时候我们也就会选择更加”实用“的GRU。
举例说明:
结果输出:
循环神经网络层基类。
关于指定 RNN 初始状态的说明
您可以通过使用关键字参数 initial_state 调用它们来符号化地指定 RNN 层的初始状态。 initial_state 的值应该是表示 RNN 层初始状态的张量或张量列表。
可以通过调用带有关键字参数 states 的 reset_states 方法来数字化地指定 RNN 层的初始状态。 states 的值应该是一个代表 RNN 层初始状态的 Numpy 数组或者 Numpy 数组列表。
关于给 RNN 传递外部常量的说明
可以使用 RNN. call (以及 RNN.call)的 constants 关键字参数将“外部”常量传递给单元。 这要求 cell.call 方法接受相同的关键字参数 constants。 这些常数可用于调节附加静态输入(不随时间变化)上的单元转换,也可用于注意力机制。
举例说明:
在训练模型之前,我们需要配置学习过程,这是通过compile方法完成的。
他接收三个参数:优化器 opt
㈩ 【神经网络原理】神经网络结构 & 符号约定
神经元模型的符号约定:输入: ,权重(weight): ,偏置(bias): ,未激活值: ,激活输出值:
神经元可用于解决部分二分类问题 ——当有一个类别未知的 输入感知机,若 输出值a = 1时,感知机被激活 ,代表 x 属于第一类;若 输出值a = 0时,感知机未激活 ,则代表 x 属于第二类。而对于sigmoid神经元,若输出值a ≥ 0.5时,代表 x 属于第一类,否则为第二类。
不难看出,感知机可以轻松实现“与非”逻辑,而与非逻辑可以组合成其他任意的逻辑,但对于一些过于复杂的问题,我们难以写出其背后地逻辑结构。 这时候神经网络就能大显身手 :它可以自适应的学习规律,调节网络地权重和偏置等参数,我们只需要用大量的数据对其正确地训练,即可得到我们想要的效果!
那有一个很有意思的问题:相比于阶跃函数,为什么我们在神经网络中更愿意采用sigmoid函数作为激活函数呢?
首先,由于感知机的激活函数为阶跃函数(在0处突变),权重的一个小的变化就可能导致输出值的突变,而如果将激活函数替换为sigmoid函数,输出值的变化就能发生相应的小的变化,有利于网络学习;另外,由于采用二次代价函数作为损失函数时,利用BP算法求梯度值需要对冲激函数求导,sigmoid函数正好时连续可导的,而且导数很好求。
为了便于理解,先画一个三层的全连接神经网络示意图,激活函数都选用sigmoid函数。 全连接神经网络 指除输出层外,每一个神经元都与下一层中的各神经元相连接。网络的第一层为 输入层 ,最后一层为 输出层 ,中间的所有层统称为 隐藏层 。其中,输入层的神经元比较特殊,不含偏置 ,也没有激活函数 。
神经网络结构的符号约定 : 代表第 层的第 个神经元与第 层的第 个神经元连线上的权重; 代表第 层与第 层之间的所有权重 构成的权重矩阵。 分别代表第 层的第 个神经元对应的偏置、未激活值、激活值; 则分别代表第 层的所有偏置组成的列向量、所有未激活值组成的列向量以及所有激活值组成的列向量。
下面展示了一个手写体识别的三层全连接神经网络结构:
隐藏层的功能可以看作是各种特征检测器的组合:检测到相应特征时,相应的隐藏层神经元就会被激活,从而使输出层相应的神经元也被激活。