PyTorch计算机视觉实战:目标检测、图像处理与深度学习
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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函数中的关键部分是学习率,我们将在下一节中学习它。