![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=1738898082-aLw2RuXnQwJkJBeAYaEbKtJj2KFeRFmL-0-c78c7c7d8e82c0175505959dbcad0e20)
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=1738898082-P4yaHp8lD7k6V97XdgtL08RIwpM27ZKB-0-5c46a941bad2a76b267840b22a453e80)
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/38_01.jpg?sign=1738898082-j2Ia4K5SoshMKqXBBHfxXBHguplc0B1s-0-eed3b2802f8085d5d40f5b9d626f81d6)
在上述代码中,第一组参数对应连接输入层和隐藏层的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=1738898082-3xWAqz4hIhv6uU8lstXMf5wQkGaW7UKE-0-dcf7f7126de6380f49d31ee02ecda713)
❍ 定义update_weights函数:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/38_03.jpg?sign=1738898082-bmqYZL2lyOMEsZCA2jklQ8knU9eGArrJ-0-443ee9e169de7d54dc4353f027b4496b)
❍ 更新超过100轮的权重,并获取损失值和更新的权重值:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/38_04.jpg?sign=1738898082-hxnGqSbGfx1zgnrtyB6KVzl3Yp9hOvMk-0-9d14294171b4e39d0f81cc253a96d189)
4.绘制损失值的图像:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/38_05.jpg?sign=1738898082-o3YCVzWFMlw85aGWknY6W3fvl0tNFs1r-0-fdaf7252e8fa363c25fd097e7b4b21d2)
上述代码生成的图像如图1-16所示。
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/39_01.jpg?sign=1738898082-cGwNkmcAHBTNlRkSi7seQtCRU726kaH3-0-f45f4e21d09fccc0b585c9d1f6014b0e)
图1-16
如你所见,损失从0.33开始,稳步下降到0.0001左右。这表明,权重是根据输入-输出数据进行调整的,当给定输入时,就可以期望它预测出与损失函数进行比较的输出。输出的权重如下:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/39_02.jpg?sign=1738898082-6AEymtR1XhVjucSBHP3LygNw9ssnevPk-0-d927d0759bbc92d5668fb0a88fef147c)
具有相同权重的相同代码的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=1738898082-tTXJzzLtRmEp4r1Hi9fHdKZQ5C7fUrFd-0-34eb799841df3235f49ffd8f5ff0eb45)
上述代码的输出值是-0.017,这个值非常接近期望输出0。当训练更多轮时,pred_out值甚至会更接近0。
目前,我们已经学习了前向传播和反向传播。这里定义的update_weights函数中的关键部分是学习率,我们将在下一节中学习它。