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

8.3 对使用矩阵方式编写的人工智能框架进行优化

盘古人工智能框架实现了神经网络,ANN_V1.py在自研盘古人工智能框架的基础上使用矩阵进行了重构,ANN_V2.py在ANN_V1.py的基础上进一步迭代及改进。

ANN_V2.py的源代码如下:

在Spyder集成开发环境中运行ANN_V2.py代码,运行结果如下:

ANN_V2.py运行的效果非常好,最开始的误差是0.496 410 031 902 725 37,最终的误差是0.003 510 122 567 861 676 6。

ANN_V1.py中y的构建是通过np.array([[0,0,1,1]]).T转置矩阵实现的。

ANN_V2.py中的y和ANN_V1.py中的y是一样的,ANN_V2.py中的y通过np.array方法直接写成了二维数组的形式。

在ANN_V2.py代码中:

第23行代码syn0是第0个权重矩阵,是3×4的矩阵,用于连接输入层及隐藏层。

第24行代码syn1是第1个权重矩阵,是4×1的矩阵,用于连接隐藏层及输出层。

第29行代码构建输入层l0(第0层)。

如图8-16所示,第30行、第31行代码是前向传播的实现过程。

第30行代码构建神经网络的隐藏层(第1层),将输入层及第0个权重进行点积运算。

第31行代码构建输出层(第2层),将第1层隐藏层的输出结果和第1个权重进行点积运算。

如图8-17所示,第40~49行代码实现反向传播的实现过程。

第34行代码计算神经网络的误差。y是实际值,l2是预测值,将实际值y减去预测值l2得到误差值。

第40行代码中l2是输出层,将l2的值传入到nonlin函数,计算出l2_delta误差。

第43行代码计算l1_error,是第一个隐藏层每一个元素需负的责任。

图8-16 前向传播的实现过程

图8-17 反向传播的实现过程

第46行代码将l1进行求导计算和l1_error相乘,得到l1_delta。

第48行代码更新第1个权重syn1。syn1是连接输出层与隐藏层的权重,l1.T是第1个隐藏层的转置矩阵,通过l1.T转置矩阵与l2_delta进行矩阵点积运算,然后更新第1个权重syn1。

第49行代码更新第0个权重syn0。syn0是连接输入层与隐藏层的权重,l0.T是输入层的转置矩阵,通过l0.T转置矩阵与l1_delta误差值进行矩阵点积运算,然后更新第0个权重syn0。

如图8-18所示,ANN_V2.py构建的神经网络包括输入层(第0层)、隐藏层(第1层)、输出层(第2层),输出层与隐藏层之间有一个权重syn1,隐藏层和输入层之间有一个权重syn0,权重不断地进行更新。从最后的预测结果看,预测结果是不错的。

图8-18 ANN_V2.py神经网络结构图