美文网首页
【Tensorflow】深度神经网络原理

【Tensorflow】深度神经网络原理

作者: 紫晶葫芦 | 来源:发表于2019-05-18 17:53 被阅读0次

    1.正向传播与反向传播

    函数定义 输入:X (Original Input)
    参数:W、B
    预测值:y
    标签值:Y (Original Input 的实际值)

    • 正向传播: WX +B
      正向传播的过程也是识别的过程。通过算法公式 W
      (input)+ B 得出识别结果为预测值 y。
      图3
      以上图为例:输入是4 ,识别的结果 y 假设为3.6。其中差异为(Y-y)= 0.4。
      差异明显很大。这时候就发现参数 W、B是影响识别结果的关键因数。如何获取正确的参数W、B成为识别精度的关键。反向传播也就应运而生了。
    • 反向传播 :根据(标签值Y - 预测值y )的差异 反向 调整 参数 W、B。
      通过正向传播->反向传播->正向传播->.......的多次的循环往复的去训练它,就可以得到识别精度较高的参数W、B。固化后的W、B则就成为了我们的所要的模型。

    2.softmax及损失函数

    • softmax分类算法:tf.nn.softmax(logits,name=None)


      图4

      softmax:算法主要是对输入的x 进行分类,最后的到的结果是:它属于每个分类所占的概率。
      例如上图:x1 计算得到的结果:可能是属于y1的概率是0.2,属于y2的概率是0.3,属于y3的概率是0.5.

    • 损失函数
      在反向传播中我们知道,对于调整的参数 W、B 是通过(标签值Y - 预测值y )的差异去做的,而这个差异不是简单的减法得到的,它是通过损失函数得到的。
      以下是tensorflow的损失函数:
      1.均值平方差(适用于输入是实数,无间的值)以下是在tensorflow中的具体的函数
      MSE = tf.reduce_mean(tf.square(input_labs,output))
      MSE = tf.reduce_mean(tf.pow(tf.sub(input_labs,output),2.0))
      MSE = tf.reduce_mean(tf.square(tf.sub(input_labs,output)))
      
      2.交叉熵(一般用于分类上,适用于输入标签是分类标签)以下是在tensorflow中的具体的函数
      tf.nn.softmax_cross_entorpy_with_logits
      tf.nn.sigmoid_cross_entorpy_with_logits
      tf.nn.sparse.softmax_cross_entorpy_with_logits
      tf.reduce_sum(y*tf.log(pred),1)
      
      我们发现(标签值Y - 预测值y )的差异的计算,不仅要明白用什么样的具体函数方式去计算,还要明白用什么样的类型去计算。

    3.梯度下降与学习率

    • 梯度下降
      作用:在通过损失函数求(标签值Y - 预测值y )的差异的时候,要顺着梯度下降的方式去求,这样我们的差异才能逐渐的缩小,然后找到最优解。
      在Tensorflow中提供了两个求梯度下降的方法:
      tf.train.GradientDescentOptimizer
      tf.train.AdamOptimizer
      
    图5
    梯度下降的方法有
    1.批量梯度下降
    2.随机梯度下降
    3.小批量梯度下降
    • 学习率
      在做梯度下降的时候我们要关注的就是学习率,也就是计算差异的间隔,如果学习率太大,有漏掉最优解的时候。所以一般的学习率的设置应该是开始比较大,最后变化比较小,多采用百分比的形式。
      好的学习率的表现方式:应该是如下图的红线,逐渐的收敛。
      下图的垂直坐标可以看作是:差异,水平坐标可以看做是:次数。


      图6

      在tensorflow中为我们提供了退化学习率:

      tf.train.expcnential_decay(starter_learning_rate,global_step,100000,0.94);
      

    意思是:starter_learning_rate 开始的学习率,global_step:到达的步速,每隔:100000 步,学习率减少到原来的94%。
    注意:学利率的设置具有经验性,并且需要重复设置。已达到速度快但又不会略过最优解。

    4.多层神经网络

    由单层的神经网络有自己的缺陷,那就是解决的都是一些线性的问题,遇到了非线性的问题就束手无策了,所以就引入了多层的神经网络,去解决线性问题,当然多层的神经网络也能兼顾解决线性问题。下图就是多层神经网络的示意图:

    图7
    多层神经网络有它的优势:1.能提升模型的精确度。2.解决了非线性的问题。
    但同时也有它的不足:1.层数多则识别所用时间增加。2.增加了层数和它得到的识别的精度是不成正比的,也就是说层说增多,它的识别率不一定增加,有可能会减少。
    我们以ConventJS 为例:区分红绿圆点。
    如下图:这是一个有4层网络识别的结果:我们发现它基本上是分开了红绿圆点。
    图8
    而下图则使用了8层的网络的识别结果:它不仅花费的时间比4层的长很多,并且还有部分红绿圆点无法区分。
    图9

    ConventJS例子:https://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html
    那么为什么层数增加而精度提高没有提高呢?
    那就是下一个与精度相关的内容:激活函数。

    5.激活函数

    图9
    • 激活函数的作用:
      1.在每一层网络计算完成后加一个激活函数,它的作用就是使网络变成了非线性的。

      2.提高识别率。
    • 激活函数的分类:
      在tensorflow 中有许多的激活函数,常用的有以下三个:


      图10

      1.Sigmoid函数:它最终的预测值会压缩到【0 ~ 1】之间 ,X趋近于无穷大时候 梯度消失,我们如果取X=100和X=1000 的时候发现Y的取值变化不大,那么得到的结论就是X在100 到1000 之间 Y的值就丢掉了。那么它的有效的取值范围【-6 ~ 6】或是【-3 ~ 3】之间。【-3 ~ 3】之间则更明显。所以在使用了它以后的多层网络,层数越多最后得到的有效特征会越来越少。
      2.Tanh函数:它最终的预测值会压缩到【-1~ 1】之间,但是还有与Sigmoid函数一样的问题,的多层网络,层数越多最后得到的有效特征会越来越少。
      3.Relu函数:它最终的预测值是【0 ~ +∞】,目前在多层神经网络中使用最多的函数。
      总结:Sigmoid函数:特征相差不明显的分类要求效果比较好 ,Tanh函数:在特征相差明显的 分类要求效果比较好 , Relu函数:处理后的数据有很好的稀疏性,它意思是将数据转化为只有最大数值其他都是0。这种变化可以近似保留最大的数据特征。

    6.补充

    https://www.w3cschool.cn/tensorflow_python/tensorflow_python-mesu2f8d.html

    相关文章

      网友评论

          本文标题:【Tensorflow】深度神经网络原理

          本文链接:https://www.haomeiwen.com/subject/esmbaqtx.html