【小结1】关于神经网络相关课程学习的小结

本次结共分为三部分:1.深度学习和神经网络的理论基础     2.用Python从零实现图片识别神经网络     3.神经网络项目实践

 

一、深度学习和神经网络的理论基础 

    1.深度学习

首先理清深度学习,机器学习和人工智能之间的关系。如图1:

                                                           

                                                                                              图 1

 即人工智能 > 机器学习 > 深度学习。

机器学习是实现人工智能的一种方法。为了实现机器学习,我们必须实现三个基本点:

1,输入足量分析数据。

2,期待输出样本。

3,一种衡量算法运行效果的评价方式。例如我们要做图像识别,识别图片中是猫是狗,那么当算法运行输出结果后,我们通过计算算法判断正确的图片数所占总图片数的比例来衡量算法的效果,同时算法根据这个结果来调整它自己的运行方式,这种自我调整就是机器学习中,‘学习’二字的要义。

       深度学习也是实现机器学习 的一种方法。它的工作流程和上述三个基本点相似,但深度学习有独到的数据处理方法。深度学习会对输入数据进行多个层次的加工,数据输入模型后,经过第一层工序,加工处理得到新的结果,新结果再输入第二层工序,加工处理后又得到新的处理结果,于是加工工序的多少就对应于所谓的深度。如图2(盗图):

                      

                                                                                    图 2 

       上图展示的就是一个深度学习过程。最左边是一幅图案,这幅图案表示手写的数字“4”,中间4条白杆表示用来加工最左边数字图案的4道工序(层)。数字图案输入模型后,先经过第一道白杆的处理,得到的处理结果发送给第二道白杆,依次类推,最后一道白杆输出一组新数据,我们看到最右边的黑杠中,只有数字4所在的地方是白色,其他地方是黑色,它意思是说,图片里面的图案表示数字4。由此我们也可以说,上面机器学习的模型“深度”为4,因为它有四道关口进行数据处理。

当这张图片被传进这个网络的第一层Layer1,即要进入第二层,但是在第一层和第二层之间有一道“过滤网”。这个过滤网叫做权重,它改变这个图片矩阵。Layer2进入Layer3又改变一次,以此类推,直到最后。当输出结果与图片4不相符的时候,说明这个网络的权重选取得不好,需要调整,并且需要调整三个权重(Layer1---Layer2,Layer2---Layer3,Layer3---Layer4)。调整后的权值应可保证图片4被识别,即达到正确的输出结果(Final Output)。

2.Tensor

神经网络本质上是一种大数据分析算法,任何算法得以运行,都必须依靠特定的数据结构,而用于将各种数据统一封装并输入网络模型的数据结构叫tensor,也就是张量。张量在不同的情况下存有不同的形式。

张量一大特征是维度,一个0维张量就是一个常量。一个一维数组的张量是 1。一个二维数组的张量是2。3维张量就是元素为2维数组的一维数组,同理4维张量就是元素为3维张量的一维数组。

一个n维张量经常用一组数据来表示,例如上面的3维张量,它可以用(4,2,2)这组数据结合来表示,一个张量是几维度,那么括号里面就有几个数字,面对(4,2,2) 我们可以这么解读,由于括号里有3个数字,因此它表示一个3维张量,这个张量包含4个元素,每个元素是一个2维张量,2维度张量含有两个元素(第一个2),每个元素是一维张量,每个一维张量含有两个(第二个2)常量。在本文第一部分,输入的图片就是一个三维张量,张量中含有60000个二维张量,也就是二维数组,每个二维数组表示一张数字图片。对于图片来说,假如每个像素点我们用RGB值表示,于是一个像素点就可以用含有三个数据点的一维数组表示,例如红色就是[255,0,0]。一张大小为256*256的图片就可以用3维张量表示(256, 256, 3), 那么一个128张图片的集合就可以用4维数组表示(128, 256, 256, 3)。

3.神经元和激活函数

先看图3(盗图):

                  

                                                                                        图3

 

 如图,每个layer的圈123就是神经元。第一层神经元叫做输入层,接收输入的数据。layer2叫做隐藏层,用于处理输入层传过来的数据,layer3叫做输出层,用于输出结果。层与层之间有不同的权值矩阵。当layer1接收到输入数据后,应先与layer1---layer2中间的权值矩阵做矩阵乘法运算,再经过激活函数处理才输入进layer2。以此类推。

想象你把手指深入水中,如果水的温度不高,你不会感到疼痛,如果水的温度不断升高,当温度超过某个度数时,你会神经反射般的把手指抽出来,然后才感觉到疼痛,这就是输入神经元的电信号强度超过预定阈值后,神经元做出反应的结果。为了模拟神经元这种根据输入信号强弱做出反应的行为,在深度学习算法中,运用了多种函数来模拟这种特性,最常用的是步调函数和sigmoid函数。这里不具体介绍。

4.反向传播改进神经网络

看图4:

                                     

                                                                                                     图4 

 由图可知,网络输出结果Out和正确结果True是有偏差的,叫做error。有错就要改,且W1,1占的错误成分要高于W2,1。所以需要修改W1,1和W2,1的值。再看一个复杂一点的网络,图5:

                       

                                                                                               图5 

其中红色表示各节点的误差值,淡黄色表示分到每条权值的误差(每条权值应该承担的错误) 。由图可得输出层和中间层分别有一个两行一列的e向量。且不难看出中间层和输出层之间的W11的误差=e1* W11/(W11+W12)=1.5*2/5=0.6,同理W12=0.1,这样中间层的第一个结点的误差就是0.6+0.1=0.7。其他点同理。

通过反向传播,我们就能把最外层节点获得的误差传导给神经网络每一层的每个节点,每个节点再根据获得的误差调整它与下一层网络节点的链路权重,这个误差回传过程就是神经网络中经常提到的反向传播机制。

中间两个神经元的计算如图6:

                                                                          图6  

可以进一步把分母去掉。其实就是前面权值矩阵的转置:

 

5.梯度下降法

由于神经元的信号是由上一层的多个神经元传入,并且多个信号组合在一起后(W运算),还经历了一次非线性的激活函数运算,所以不能直接算出神经元链路修改后的数值。这里采用梯度下降法。

以前学过,这里不说了,前面有写过博客。直接用结论。

二、用Python从零实现图片识别神经网络

搭好环境,就可以代码手动实现,代码链接在前几天的博客里:https://blog.csdn.net/zbl1243/article/details/83448299

代码要导出三个接口,分别完成以下功能:

1,初始化initialisation,设置输入层,中间层,和输出层的节点数。
2,训练train:根据训练数据不断的更新链路的权重值
3,查询query,把新的数据输入给神经网络,网络计算后输出答案。

敲一遍代码才会更好的理解整个网络是怎么实现识别的。部分效果代码:

图片识别率达到94.06%。 

三、神经网络项目实践

三个项目都是直接使用keras框架快速的搭建学习网络。(调用)

1.使用神经网络分析电影评论的正能量与负能量

由于项目都是调用框架,这里就取一些要点做一下记录。

在深度学习中,有一种常用的数据格式叫:one-hot-vector,它的形式是这样的,假设集合中总共有10个整数{0,1,2,3,4,5,6,7,8,9},我们选取一个子集,它包含所有偶数,也就是{0,2,4,6,8},那么对应的one-hot-vector就是一个含有10个元素的向量,如果某个元素出现在子集中,我们就把向量中对应的元素设置为1,没有出现则设置为0,于是对应子集的向量就是:[1, 0, 1, 0, 1, 0, 1, 0, 1, 0]。由于文本中只包含10000个单词,于是我们设置一个长度为一万的向量,当某个频率的词出现在文章中时,我们就把向量相应位置的元素设置成1。

当我们的网络用来将数据区分成两种类型时,损失函数最好使用binary_crossentroy,它的表达式如下:

Hy′(y):=−∑i(y′ilog(y[i])+(1−y′[i])log(1−y[i]))

其中y[i]对应的是训练数据提供的结果,y'[i]是我们网络计算所得的结果。

但是随着迭代次数的增加,网络对训练数据识别的准确度越来越高,也就是loss越来越低,然后校验数据的识别准确的却越来越低,这种现象叫“过度拟合”,这意味着训练的次数并不是越多越好,而是会“过犹不及”,有时候训练迭代次数多了反而导致效果下降。

2.将新闻报道按照不同话题性质进行分类

在第1部分我们构造网络时,中间层网络我们设置了16个神经元,由于现在我们需要在最外层输出46个结果,因此中间层如果只设置16个神经元那就不够用,由于输出的信息太多,如果中间层神经元数量不足,那么他就会成为信息过滤的瓶颈。

神经网络在实际项目中的运用有点类似于乐高积木,你根据实际需要,通过选定参数,用几行代码配置好基本的网络结构,把训练数据改造成合适的数字向量,然后就可以输入到网络中进行训练,训练过程中记得用校验数据监测最优训练次数,防止过度拟合。 

3. 利用神经网络在少量数据情况下预测房价走势

由于数据量很小,因此我们的网络不能架构过大,基本上用两个中间层,每层64个节点即可。一个需要注意的问题在于,当训练数据越少时,过度拟合就会越严重,只有缩小网络的结构,我们才能抑制过度拟合的严重程度。

由于给的数据是多维性的(13维),即单位不同,有的是价格,有的是概率。所以要先对数据处理,需要把数据的格式统一起来,如果把不同格式,不同单位的数据杂糅一起输入网络会影响结果的准确度。数据规格化的做法是,计算每一个种类数据的均值,然后每个数据实例减去该均值,然后在除以数据的标准差。

我们构造的网络最后一层只有一个节点(房价),因为我们只需要预测一个结果,同时该节点没有激活函数,当我们要预测的结果处于某个区间内时,我们就不用添加激活函数。如果使用激活函数的话,输出结果的取值范围就会收到影响。

要将得到的所有数据分成两组,一组用于训练网络,一组用于校验训练的结果。目前有一个问题是,数据量太小,这导致的结果是,我们对数据划分的不同方式都会对校验结果产生不同影响,如此一来我们就不能对网络的训练情况有确切的掌握。处理这种情况的有效办法叫k-fold交叉检验,k一般取4到5,选其中的k-1分数据来训练,剩下1份来校验。网络总共训练k次,每一份数据都有机会作为校验集,最后把k次校验的结果做一次平均。

4.总结(授课者)

数据预处理其实就是要根据项目特点,把相应的数据向量化。在绝大多数数情况下,神经网络的输入数据格式都是向量,只不过不同的需求,输入向量的维度不同而已。无论我们要处理的对象是声音,图像,我们都需要把相关数据抽取出来,合成向量,例如前面项目中我们使用一种向量叫"one-hot",也就是一个大向量,所有元素都是零,除了其中某一个是1.

我们还要注意的是,向量数值的正规化。

我们还需处理的是数据缺失,本来需要100个数据,但实际获得的只有90个,还有10个因为各种原因遗漏了,这在真实项目实践中几乎是必然发生的事情。通常情况下,我们可以用0填充遗漏的数据,要注意的是遗漏发生在测试数据集里,处理这中情况的办法是,在训练数据集中做一些复制,营造出像测试数据集那样有数据缺失的样子。

 

 

这三个项目的代码还没有完成,等待本文后续更新。下载数据还要找VPN。。另外对过度拟合还有一些方法后序再写出。附上课程地址:https://study.163.com/course/courseMain.htm?courseId=1004951012&share=1&shareId=1145010377

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值