![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=1739314808-Py3NMxThXTRxhIpGG6qTiq0q1Unpftnc-0-afa6508823760ebf2c0492133fa8f895)
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=1739314808-QZrCpUsKMx3iWcGbpvIOZKkkTInbkzyN-0-48e1b58967651ca239327c70dcc5743f)
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/38_01.jpg?sign=1739314808-FgvBAhFh851oRk99vI4BEgUSGoQmPcQj-0-7507ceaf6da9b8953a2d997d536ad049)
在上述代码中,第一组参数对应连接输入层和隐藏层的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=1739314808-uz1RogpIHbehupi0Hu9ExBf28tLXI8BP-0-ea8a8a9288517142e7105d1539d22433)
❍ 定义update_weights函数:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/38_03.jpg?sign=1739314808-DgcDpr6GYtghQxCeneB670o2JeRu4Dtj-0-db282f1059d4228b14e1cee6b2296f84)
❍ 更新超过100轮的权重,并获取损失值和更新的权重值:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/38_04.jpg?sign=1739314808-7NR9x16GEvTzF8heKYamsANQJNLsGUjN-0-b986c9fe0b022af6b1edd2c763c215e2)
4.绘制损失值的图像:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/38_05.jpg?sign=1739314808-0twmlmzVb7D8XpPWtKrMPWKwD4UROo7n-0-be5fff09cbd4311a7785fea87f2e1e28)
上述代码生成的图像如图1-16所示。
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/39_01.jpg?sign=1739314808-ihP5bikLKfPgdBewRhl8OwIB3SULZNKi-0-e1f1ce16517a730284ea8f83a2140aa8)
图1-16
如你所见,损失从0.33开始,稳步下降到0.0001左右。这表明,权重是根据输入-输出数据进行调整的,当给定输入时,就可以期望它预测出与损失函数进行比较的输出。输出的权重如下:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/39_02.jpg?sign=1739314808-kwvQqryPpOOfXB17qR1wXnKpzk9f9SF2-0-e2fd646536e3a6456a4d73d8a43e13fc)
具有相同权重的相同代码的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=1739314808-q1xzOmORISE4FmXZsJYFPzKy9JyMmDE8-0-69261be9f280a797b4cf472e8fa6252c)
上述代码的输出值是-0.017,这个值非常接近期望输出0。当训练更多轮时,pred_out值甚至会更接近0。
目前,我们已经学习了前向传播和反向传播。这里定义的update_weights函数中的关键部分是学习率,我们将在下一节中学习它。