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