长沙网站开,西安seo排名公司,python做简单网站,深圳外贸网络推广误差反向传播法 前言 此为本人学习《深度学习入门》的学习笔记 四、简单层的实现 本节将用 Python 实现前面的购买苹果的例子。这里#xff0c;我们把要实现的计算图的乘法节点称为“乘法层”#xff08;MulLayer#xff09;#xff0c;加法节点称为“加法层”#xff08;… 误差反向传播法 前言 此为本人学习《深度学习入门》的学习笔记 四、简单层的实现 本节将用 Python 实现前面的购买苹果的例子。这里我们把要实现的计算图的乘法节点称为“乘法层”MulLayer加法节点称为“加法层”AddLayer。 1、乘法层的实现 层的实现中有两个共通的方法接口forward() 和backward()。forward() 对应正向传播backward() 对应反向传播。 实现乘法层。乘法层作为 MulLayer 类其实现过程如下所示 class MulLayer:def __init__(self):self.x Noneself.y Nonedef forward(self, x, y):self.x xself.y yout x * yreturn outdef backward(self, dout):dx dout * self.y # 翻转x和ydy dout * self.xreturn dx, dy __init__() 中会初始化实例变量 x 和 y它们用于保存正向传播时的输入值。forward() 接收 x 和 y 两个参数将它们相乘后输出。backward() 将从上游传来的导数dout乘以正向传播的翻转值然后传给下游。 使用 MulLayer 实现前面的购买苹果的例子2 个苹果和消费税。 图 5-16 购买 2 个苹果 使用这个乘法层的话图 5-16 的正向传播可以像下面这样实现 此外关于各个变量的导数可由 backward() 求出。 调用 backward() 的顺序与调用 forward() 的顺序相反。此外要注意 backward() 的参数中需要输入“关于正向传播时的输出变量的导数”。比如mul_apple_layer 乘法层在正向传播时会输出 apple_price在反向传播时则会将 apple_price 的导数 dapple_price 设为参数。 2、加法层的实现 class AddLayer:def __init__(self):passdef forward(self, x, y):out x yreturn outdef backward(self, dout):dx dout * 1dy dout * 1return dx, dy 加法层不需要特意进行初始化所以 __init__() 中什么也不运行pass 语句表示“什么也不运行”。加法层的 forward() 接收 x 和 y 两个参数将它们相加后输出。backward() 将上游传来的导数dout原封不动地传递给下游。 使用加法层和乘法层实现图 5-17 所示的购买 2 个苹果和 3 个橘子的例子。 图 5-17 购买 2 个苹果和 3 个橘子 用 Python 实现图 5-17 的计算图的过程如下所示 首先生成必要的层以合适的顺序调用正向传播的 forward() 方法。然后用与正向传播相反的顺序调用反向传播的 backward() 方法就可以求出想要的导数。 五、激活函数层的实现 将计算图的思路应用到神经网络中。把构成神经网络的层实现为一个类。先来实现激活函数的 ReLU 层和 Sigmoid 层。 1、ReLU层 激活函数 ReLURectified Linear Unit由下式5.7表示。 通过式5.7可以求出 y 关于 x 的导数如式5.8所示。 在式5.8中如果正向传播时的输入 x 大于 0则反向传播会将上游的值原封不动地传给下游。反过来如果正向传播时的 x 小于等于 0则反向传播中传给下游的信号将停在此处。用计算图表示的话如图 5-18 所示。 实现 ReLU 层。在神经网络的层的实现中一般假定 forward() 和backward() 的参数是 NumPy 数组。 图 5-18 ReLU 层的计算图 class Relu:def __init__(self):self.mask Nonedef forward(self, x):self.mask (x 0)out x.copy()out[self.mask] 0return outdef backward(self, dout):dout[self.mask] 0dx doutreturn dx Relu 类有实例变量 mask。这个变量 mask 是由 True/False 构成的 NumPy 数组它会把正向传播时的输入 x 的元素中小于等于 0 的地方保存为 True其他地方大于 0 的元素保存为 False。 2、Sigmoid层 实现sigmoid函数sigmoid函数由式5.9表示 用计算图表示式子5.9的话则如图5-19所示 图 5-19 sigmoid 层的计算图仅正向传播 图 5-19 中除了“×”和“”节点外还出现了新的“exp”和“/”节点。“exp”节点会进行 y exp(x) 的计算“/”节点会进行 的计算。 如图 5-19 所示式5.9的计算由局部计算的传播构成。 下面我们就来进行图 5-19 的计算图的反向传播。这里作为总结我们来依次看一下反向传播的流程。 步骤 1 “/”节点表示 它的导数可以解析性地表示为下式。 根据式5.10反向传播时会将上游的值乘以 正向传播的输出的平方乘以 -1 后的值后再传给下游。计算图如下所示。 步骤 2 “”节点将上游的值原封不动地传给下游。计算图如下所示。 步骤 3 “exp”节点表示 y exp(x)它的导数由下式表示。 计算图中上游的值乘以正向传播时的输出这个例子中是 exp(-x)后再传给下游。 步骤 4 “×”节点将正向传播时的值翻转后做乘法运算。因此这里要乘以 -1。 图 5-20 Sigmoid 层的计算图 转载于:https://www.cnblogs.com/zyqy/p/10816953.html