![PyTorch计算机视觉实战:目标检测、图像处理与深度学习](https://wfqqreader-1252317822.image.myqcloud.com/cover/947/50417947/b_50417947.jpg)
1.3.5 前向传播的代码
前向传播的高级编码策略如下:
1.在每个神经元上执行乘积和。
2.计算激活。
3.在每一个神经元上重复前两步,直到输出层。
4.通过比较预测与实际输出来计算损失。
可将它看成一个函数,将输入数据、当前神经网络权重和输出数据作为函数的输入,并返回当前网络状态的损失。
下面将给出计算所有数据点的均方误差损失值的前馈函数。
下列代码可以从本书GitHub存储库(https://tinyurl.com/mcvppackt)Chapter01文件夹中的Feed_forward_propagation.ipynb获得。
强烈建议你通过单击每个notebook中的Open in Colab按钮来执行code notebook。截图示例如图1-13所示。
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/28_02.jpg?sign=1739050508-dilabJtdnzYPxtVj09CMGakVpoY7bQq5-0-89de28ef23d9fd9fab187a6b0d0f2a33)
图1-13
单击Open in Colab按钮(图1-13中画圈部分)时,你将能够顺利地执行所有的代码,并应该能够复现本书中显示的结果。
现在有了执行代码的正确方法,下面继续编写前向传播的代码:
1.将输入变量值(inputs)、weights(如果是第一次迭代则随机初始化)和所提供数据集的实际outputs作为feed_forward的参数:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/29_01.jpg?sign=1739050508-yhOAk9K6SSvONl7EZvMFPqgye0D9G6jf-0-97cc5128cc117e9f44af28c11bbfacdf)
为了使这个练习更现实一些,我们将对每个节点设置偏置项。因此,权重数组不仅包含连接不同节点的权重,而且还包含隐藏/输出层中与节点相关的偏置项。
2.通过对inputs与连接输入层和隐藏层的权重值(weights[0])进行矩阵乘法(np.dot)计算隐藏层值,并将它与隐藏层节点相关的偏置项(weights[1])相加:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/29_02.jpg?sign=1739050508-uV0Nr2BX32ETHeuqlPFMJerhE5iMdnrI-0-71bd4e05eb44220bf338f5e905798a6e)
3.对上一步pre_hidden中获得的隐藏层值使用S型激活函数:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/29_03.jpg?sign=1739050508-Iueuq03NbRKtonlQNhXourM0eTPLBGUs-0-9b021058f9d40561e40bfebe0c41e0bd)
4.通过执行隐藏层激活值(hidden)与连接隐藏层和输出层的权重(weights[2])的矩阵乘法(np.dot)计算输出层的值,并将输出层中与节点相关的偏置项求和——weights[3]:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/29_04.jpg?sign=1739050508-ffNcgsZHPQn8OvCFkC0SYd0oy2BTI0rn-0-594f620c4fcd57f728ae39fced2c86f4)
5.计算整个数据集的均方误差值并返回均方误差:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/29_05.jpg?sign=1739050508-KjsTfdXcQqpA5Z6LYmXIGEtwMUHhqQ1j-0-820108d66d6c6af1b94527b92ed8ee11)
此时当数据向前通过网络时,就可以得到均方误差值。
在学习反向传播之前,首先需要学习之前构建的前馈网络的一些计算组件,即对激活函数和损失值的计算,可以使用NumPy进行计算,以便详细了解它们是如何工作的。
激活函数的代码
将S型激活函数应用于前面代码中隐藏层值的顶部时,我们来看看其他常用的激活函数:
❍ Tanh——某个值(隐藏层单元值)的tanh激活函数计算代码如下:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/29_06.jpg?sign=1739050508-EvM07uTOGolMFugqWzUGsZQup5HD8Ksy-0-a249bb985453c47b340362c43a0b6986)
❍ ReLU——某个值(隐藏层单元值)的整流线性单元(ReLU)计算代码如下:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/29_07.jpg?sign=1739050508-hPTABxENvRBE7CtR21xWMQ3jkWmX7JcV-0-dbee6e76e22e91dfcaa8ab5c1804379b)
❍ 线性——某个值的线性激活就是这个值本身,计算代码如下:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/30_01.jpg?sign=1739050508-5ruSdPUN2uGEtfn9vBCisQnbKKljcI97-0-94e3b94fcb1fc40db2fb11627374c3f6)
❍ softmax:与其他激活函数不同,softmax在一组值上执行。这样做通常是为了确定某个输入属于给定场景中m个可能输出类别中某个类别的概率。假设需要分类的图像具有10个可能的类别(对应数字0到9)。此时就有10个输出值,每个输出值代表输入图像属于这10个类别中某一个类别的概率。
softmax激活用于为输出中的每个类提供一个概率值,计算代码如下:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/30_02.jpg?sign=1739050508-v9NhWLGSzgIQsn732cy73FmXEn6e1sCU-0-b83a880206145cb7115129c9f2c6fa3f)
注意输入x上面的两个操作——np.exp将使所有值为正,除以所有这些指数的np.sum(np.exp(x))可以将所有值限制在0和1之间。这个范围与事件发生的概率一致。这就是我们所说的返回一个概率向量。
现在我们已经学习了各种激活函数,下面将学习不同的损失函数。
损失函数的代码
损失值(在神经网络训练过程中被最小化)通过更新权重值被最小化。确定合理的损失函数是建立可靠神经网络模型的关键。构建神经网络时,通常使用的损失函数如下:
❍ 均方误差:均方误差是输出的实际值和预测值之差平方的平均值。取误差的平方,是因为误差可以是正的,也可以是负的(当预测值大于实际值时,反之亦然)。平方可以确保正误差和负误差不互相抵消。计算误差平方的平均值可以使误差在两个样本量不同的数据集之间具有可比性。
预测的输出值数组(p)与实际的输出值数组(y)之间的均方误差计算代码如下:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/30_03.jpg?sign=1739050508-6cNVhbmlQj4EgfyWtgpBBt1LT0ibOBuz-0-2e227f561b795239b0a6a2c8d491798a)
预测连续值的时候,通常使用均方误差。
❍ 平均绝对误差:平均绝对误差的工作方式非常类似于均方误差。平均绝对误差通过取所有数据点上实际值和预测值之间的差值绝对值的平均数来确保正误差和负误差不相互抵消。
预测的输出值数组(p)与实际的输出值数组(y)之间的平均绝对误差计算代码如下:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/30_04.jpg?sign=1739050508-uivupZEPog9r1vB90t7KETixfUs3kEpJ-0-7eb6349e26dbf89acf5f8d613dc4e894)
与均方误差类似,连续变量通常采用平均绝对误差。此外,一般来说,在预测输出中包含小于1的值的时候,最好使用平均绝对误差作为损失函数。在预期输出小于1的时候,均方误差将大大降低损失量(-1和1之间的数字的平方是一个更小的数字)。
❍ 二元交叉熵:交叉熵用于度量实际概率分布和预测概率分布这两种不同分布之间的差异。二元交叉熵用于处理二元输出数据,不像我们前面讨论的两个损失函数(用于对连续变量的预测)。
预测值数组(p)和实际值数组(y)之间的二元交叉熵计算代码如下:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/31_01.jpg?sign=1739050508-b6gtgUXGC0pXIVn3ZVUuDzDqZPiePRlW-0-c05bf5fe521bba5008170c6bfa1bfbcb)
需要注意的是,当预测值与实际值相差较大时,二元交叉熵损失较大;当预测值与实际值相近时,二元交叉熵损失较小。
❍ 分类交叉熵:预测值数组(p)和实际值数组(y)之间的分类交叉熵实现代码如下:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/31_02.jpg?sign=1739050508-D49JEBMAkS5EhR6GJtCsi9HA7gTyxuxJ-0-fbfd03d0d50e38f7dfb66bc14d5f43f1)
目前已经学习了前向传播,以及构成前向传播的各种组件,如权重初始化、与节点相关的偏置项、激活和损失函数。在下一节中,我们将学习反向传播(backpropagation),这是一种调整权重的技术,使损失值尽可能小。