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中的具体的函数
2.交叉熵(一般用于分类上,适用于输入标签是分类标签)以下是在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)))
我们发现(标签值Y - 预测值y )的差异的计算,不仅要明白用什么样的具体函数方式去计算,还要明白用什么样的类型去计算。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)
3.梯度下降与学习率
- 梯度下降
作用:在通过损失函数求(标签值Y - 预测值y )的差异的时候,要顺着梯度下降的方式去求,这样我们的差异才能逐渐的缩小,然后找到最优解。
在Tensorflow中提供了两个求梯度下降的方法:tf.train.GradientDescentOptimizer tf.train.AdamOptimizer
梯度下降的方法有
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.多层神经网络
由单层的神经网络有自己的缺陷,那就是解决的都是一些线性的问题,遇到了非线性的问题就束手无策了,所以就引入了多层的神经网络,去解决线性问题,当然多层的神经网络也能兼顾解决线性问题。下图就是多层神经网络的示意图:
多层神经网络有它的优势: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
网友评论