1.5 整合前向传播与反向传播
在本节中,我们将在与1.3.5节相同的小数据集上构建一个简单的神经网络,它通过隐藏层连接网络输入和输出,并使用在前一节中定义的update_weights函数执行反向传播来获得最佳权重和偏置项。
模型定义如下:
1.输入连接到一个隐藏层,该层有三个单元/节点。
2.隐藏层连接到输出,该输出层中有一个单元。
下列代码见本书的GitHub存储库(https://tinyurl.com/mcvp-packt)Chapter01文件夹中的Back_propagation.ipynb notebook。
按如下步骤创建网络:
1.导入相关的包并定义数据集:
2.随机初始化权重和偏置项。隐藏层中有3个单元,每个输入节点与每个隐藏层单元相连。因此,总共有6个权重值和3个偏置项,其中1个偏置和2个权重(2个权重来自2个输入节点)对应每个隐藏单元。另外,最后一层有1个单元连接到隐藏层的3个单元。因此,输出层的值由3个权重和1个偏置项决定。随机初始化的权重如下所示:
在上述代码中,第一组参数对应连接输入层和隐藏层的2×3权重矩阵。第二组参数表示与隐藏层每个节点相关联的偏置项。第三组参数对应将隐藏层加入输出层的3×1权重矩阵,最后一组参数表示与输出层相关的偏置项。
3.在神经网络中运行100轮前向传播和反向传播——它们的函数在前面的内容中已经被学习并定义为feed_forward和update_weights函数。
❍ 定义feed_forward函数:
❍ 定义update_weights函数:
❍ 更新超过100轮的权重,并获取损失值和更新的权重值:
4.绘制损失值的图像:
上述代码生成的图像如图1-16所示。
图1-16
如你所见,损失从0.33开始,稳步下降到0.0001左右。这表明,权重是根据输入-输出数据进行调整的,当给定输入时,就可以期望它预测出与损失函数进行比较的输出。输出的权重如下:
具有相同权重的相同代码的PyTorch版本可以在GitHub notebook(Auto_gradient_of_tensors.ipynb)中进行演示。请你在理解了下一章中的核心PyTorch概念之后,再重新阅读本节。请自己验证输入和输出是否确实相同,无论网络是用NumPy还是用PyTorch编写的。使用NumPy数组从零开始构建网络,虽然不是最优的,但是这一章将帮助你奠定关于神经网络工作细节的坚实基础。
5.一旦有了更新的权重,就可以通过将输入传递给网络进行预测,并计算输出值:
上述代码的输出值是-0.017,这个值非常接近期望输出0。当训练更多轮时,pred_out值甚至会更接近0。
目前,我们已经学习了前向传播和反向传播。这里定义的update_weights函数中的关键部分是学习率,我们将在下一节中学习它。