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神经网络结构图