企业级AI技术内幕:深度学习框架开发+机器学习案例实战+Alluxio解密
上QQ阅读APP看书,第一时间看更新

7.5 损失度计算实现与TensorFlow的对比

在改进后的代码(Artificial_Intelligence_Framework_Main.py)中,重新设置隐藏层为hidden_nodes=[8,4,2],3个隐藏层由于不是分布式的,计算可能会有点慢。运行结果如图7-9所示,0~100次时代的时候,损失度从0.14降到0.12,然后以100次为间隔,依次变为0.07,0.03,0.01,0.009,0.001……,然后到0.000 9,0.000 6……。这个训练效果是非常理想的,在训练3000多次的时候就达到了这个效果,而以前要达到同样效果,要运行1万次左右。这说明正常情况下如果增加隐藏层,就可以提升精确度。例如将3个隐藏层增加到300个隐藏层。由于模型算法是一样的,不需要做其他的工作,所以只需要将3个隐藏层增加到300个隐藏层,就可以极大地提升精确度,这对于实际案例的开发具有极大的意义。这是完全自动化、智能化的性能提升。

图7-9 改进代码运行效果

盘古人工智能框架运行1万次以后,结果如图7-10所示,预测的第1条记录的实际值是0.0,预测值是0.016 648 710 082 689 696;预测的第2条记录实际值是1.0,预测值是0.976 363 115 130 103 5。

图7-10 改进代码后的运行效果

TensorFlow在有3个隐藏层(分别为8个神经元、4个神经元、2个神经元)的情况下,运行2000多次时代以后,无论是训练损失度还是测试损失度,此时都等于0了,精确度达到了100%,如图7-11所示,这个效果是非常惊人的。

图7-11 TensorFlow的可视化图运行结果

在第8章我们将输入数据实例集基于二维数组的实现,改为基于矩阵的实现,Python中早已实现了与矩阵相关的算法,这里我们只需知道矩阵计算的过程,暂不需要去实现这些数学公式。例如,NumPy库发展很多年,已经非常成熟,它实现了线性代数的所有算法,矩阵、转置、点积等大多数的人工智能框架都会采用NumPy作为矩阵处理的底层框架,因此没必要自己去实现一套新的NumPy库。

接下来,在改进后的代码(Artificial_Intelligence_Framework_Main.py)中,尝试设置4个隐藏层,hidden_nodes=[16,8,4,2],4个隐藏层分别有16个神经元、8个神经元、4个神经元、2个神经元。运行一下Artificial_Intelligence_Framework_Main.py。

运行结果如图7-12所示,增加一个隐藏层会相应增加很多计算量,最开始的误差是0.13402363543834808,发现效果不那么明显,因为虽然有这么多隐藏层,但输入数据只有两个特征,所以没必要设置那么多隐藏层,因为最终运行的效果差不多。

图7-12 有4个隐藏层时的运行图

在TensorFlow的可视化图中,重新设置为4个隐藏层,由于TensorFlow后台控制的原因,只能设置8个神经元,我们将第1个隐藏层设置为8个神经元,将第2个隐藏层设置为5个神经元,第3个隐藏层设置为3个神经元,第4个隐藏层设置为2个神经元。选择Tanh激活函数,单击运行按钮,这个时候的计算速度会慢一些,因为隐藏层相对比较多,且有更多的神经元,训练的过程就是调整权重的过程,如图7-13所示。

图7-13 TensorFlow有4个隐藏层时的情况

回到我们的BackPropagation.py代码,在计算反向传播的过程中,使用以下代码进行求导,然后更新权重。

在TensorFlow的可视化图中,例如查询第2个隐藏层的第2个神经元到第3个隐藏层的第2个神经元的权重,单击Weight边的那一刻的权重是–0.33,再次单击,权重变成了–0.32,因为在每次训练时权重不同。