神经网络入门

 

深度学习神经网络及实践

 

神经网络的意义

上图红色和蓝色为两个大类,如果要将其分类,最简单的是在中间画一条直线,也就是逻辑回归的方式可以将其分类,但是如果是下面的情况:

显然一条直线不行,需要两次,如果更复杂一点甚至都不能用直线分割开,这时候就需要神经网络来进行分类 神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向--深度学习的基础。

 

深度学习神经网络

 

神经网络

神经网络由神经元组成

 

神经元

神经网络的起源来自人体中的神经元

下图为神经网络中神经元的数学模型

神经元模型是一个包含输入,输出与计算功能的模型, 图中的箭头,也就是w0,w1,w2,w3称为权重,神经网络的训练就是通过训练样本数据调整权重从而使得模型的预测效果最好 如果觉得难以理解的话,可以把一个神经元模型理解为一个直线方程 每个样本或者说是训练数据有X1,X2,X3等属性(更专业的说法是特征), 输出为y=f(w0+X1*w1+X2*w2+X3*w3),其中f是激活函数,激活函数是什么下面再讲。可以看到f里面可以看做是一个直线方程

 

神经网络

神经网络模型如下

可以看到神经网络是由多个神经元组成 输入层和隐藏层之间,输入层可以看作是样本的每个特征,而隐藏层与隐藏层之间或者隐藏层和输出层之间,前者又可以看作后者的输入,最终输出层就是分类结果

 

再谈神经元激活函数

上面谈神经元时谈到了激活函数,本来应该是y= w0+X1*w1+X2*w2+X3*w3,为什么要在外面套一个激活函数呢? 什么是激活函数呢? 类似于下图中的函数:

激活函数的作用就是给模型引入非线性因素 考虑到下面这个图:

显然不是线性方程可以分割开的 而无论神经网络多么复杂,有多少层神经元,如果没有激活函数,那么最终仍然可以计算成一个线性方程,因此加入激活函数的目的就是加入非线性因素来更加广泛地解决各种复杂问题 神经网络可以当做是能够拟合任意函数的黑盒子

 

卷积神经网络(CNN)

卷积神经网络是一种专门用来处理具有类似网格结构的数据的神经网络 CNN和普通神经网络的区别之处在于CNN多了卷积层和池化层 最典型的网格结构是图片,如下所示,图片由网格结构的像素组成

CNN在计算机视觉和图像处理方面发挥了巨大作用 现在CNN在自然语言处理(NLP)方面现在也发挥巨大作用 在NLP中,对于一段文字,其中每个词是一个等长的向量,比如(2.3, 1.3, 4, 5.6)的形式,那么一段文字也可以表示成一个网格结构

 

卷积层

卷积层的核心是卷积核的移动,下图为卷积核

卷积核在输入网格中从左到右滑动然后从上到下滑动,并和对应的元素相乘,得到卷积层的输出,如下图所示

卷积层的作用是提取特征

 

池化层

池化,即对一块数据进行抽样或聚合,例如选择该区域的最大值(或平均值)取代该区域: 如下所示:

池化层的作用是降低了数据规模,以及具有平移不变性

 

卷积神经网络的意义

以检测物体边缘为例来进行说明 下图为一张左右明显像素有微小差距的图片,左右两边像素只是相差10

现在用下图所示的卷积核对其进行卷积计算

可以看到经过卷积运算后中间和两边明显相差较大,像素相差30,那么相当于将中间的边界强化了 下图是卷积神经网络的整体流程图,一般是经过几个卷积层和池化层,最后是全连接层输出预测结果。多个卷积层和池化层就提现了深度学习的意义:层层提取特征,比如要在一个图片中识别是否有猫,那么层层提取,第一层卷积层判断是否有猫的头,第二层判断是否有猫的尾巴,第三层卷积层判断猫的身子等等,如果这些特征都有,那么才能确定是否有猫

 

循环神经网络

当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列; 当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。 比如:输入法输入 [我 吃 苹果]这句话, 如果用传统的神经网络,每个词是一个向量输入,并不能关联前后每个词的关系,如果用下图所示的循环神经网络则可以处理这个问题

如图所示, 前一个输入经过隐藏层之后,并不是只是到输出层,而是也会回到隐藏层的输入,和下一个单词向量的输入结合起来,也就是每个样本数据的输出并不是只有本样本数据的输入起作用,也会受到前面的输入的作用,这样就将序列关联起来了

 

神经网络总结

除了上面提到的普通神经网络、卷积神经网络以及循环神经网络中,还有递归神经网络、LSTM等其他网络,具体都有对应的使用场景

 

深度学习项目开发流程(以手写体数字识别为例)

下面以用卷积神经网络识别手写体数字来阐述深度学习项目的开发流程 项目地址为: https://github.com/zhangmanman/DigitRecognizer

 

开发环境和工具

用python语言开发,平台为google推出的tensorflow框架

 

模型训练

 

数据预处理

DigitRecognizer这个项目的训练数据为42000张28*28大小的手写体灰度图片,因此可以看作是每个样本数据有28*28=784个特征,每个特征是0-255大小的数值,为了更好地处理,避免计算过程中出现数据过大的问题,将所有数据除以255,使得所有特征的大小在0和1之间,便于数据的计算

 

训练集和验证集

并不是所有样本数据都是用来训练,一般情况下样本数据分为训练集和验证集两个部分,训练集用来训练模型,验证集用来验证模型。 这是为了避免模型只适用于训练集,过拟合于训练集,也就是说有可能模型在训练集中看似训练好了,但是拿到新的数据中并不能进行很好的预测,所以验证集就是来验证这个模型是否具有通用性,如果在验证集上表现不好,那么就需要检查模型的问题,进行优化

 

模型调优

一般情况下很少会有一次性就得到比较好的模型,需要进行逐步调优

 

超参数调优

再来回顾一下之前讲过的梯度下降法,神经网络虽然复杂,但是最终训练算法的做法还是计算出一个损失函数,然后训练数据,不断调整权重,使得损失函数的值最小,在这点上可以将神经网络当做一个直线方程,y = w*x,w是权重,x是输入,那么y是输出值也就是预测值,y'是真实值,那么显然 s = (y-y')^2 这个函数值越小,y越接近y', 而s可以看做一个一元二次函数,函数图像如图所示,显然要到达极小点,做法是如图中红球所示,逐步滚动下来, 设斜率为k,则以y = y + α * k来更新y,其中α叫学习率,一般初步设为0.0001,更新次数叫批次,学习率和批次被称作超参数(当然,还有其他超参数), 显然如果α过小,更新过慢,批次过小,可能等更新完,并没有接近极小点,因此通过调整超参数,可以进行优化模型

 

过拟合

如下图所示为模型在训练集训练的三种效果,欠拟合,正常,和过拟合

其中欠拟合就是模型预测效果太差,可以通过调整模型和超参数调优来解决。 一般情况下,过拟合比较难解决,过拟合的意思上面提到过,就是在训练数据中表现非常好也就是模型太过复杂,可以很好地拟合训练数据,损失函数值很小,但就是因为太复杂,反而在验证集和新的测试数据上表面很差 对于过拟合,有很多做法,就是剪枝, 也就是刻意去掉一些权重,来降低模型的复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值