参考书:深度学习入门:基于Python的理论与实现
在深度学习中有一种高效计算权重参数梯度的方法----误差反向传播法。
可以通过画计算图,来帮助理解误差反向传播法。计算图的乘法节点称为乘法层,加法节点称为加法层。实现代码如下:
class MulLayer: # 乘法类
def __init__(self):
self.x = None
self.y = None
def forward(self, x, y): # 向前传递
self.x = x
self.y = y
out = x * y
return out
def backward(self, dout): # 向后传递,dout为上游传来的导数
dx = dout * self.y # 翻转x和y
dy = dout * self.x
return dx, dy
class AddLayer: # 加法类
def __init__(self):
pass
def forward(self, x, y): # 向前传递
out = x + y
return out
def backward(self, dout): # 向后传递,dout为上游传来的倒数
dx = dout * 1
dy = dout * 1
return dx, dy
#########################################################################
# if __name__ == "__main__": # 乘法测试
# apple = 100
# apple_num = 2
# tax = 1.1
#
# # layer,两个乘法操作
# mul_apple_layer = MulLayer()
# mul_tax_layer = MulLayer()
#
# # forward
# apple_price = mul_apple_layer.forward(apple, apple_num)
# price = mul_tax_layer.forward(apple_price, tax)
# print(price)
#
# # backward
# dprice = 1
# dapple_price, dtax = mul_tax_layer.backward(dprice)
# dapple, dapple_num = mul_apple_layer.backward(dapple_price)
# print(dapple, dapple_num, dtax)
#########################################################################
if __name__ == "__main__": # 乘法和加法测试
apple = 100
apple_num = 2
orange = 150
orange_num = 3
tax = 1.1
# 要进行的乘法,加法操作
mul_apple_layer = MulLayer()
mul_orange_layer = MulLayer()
add_apple_orange_layer = AddLayer()
mul_tax_layer = MulLayer()
# forward
apple_price = mul_apple_layer.forward(apple, apple_num)
orange_price = mul_orange_layer.forward(orange, orange_num)
apple_orange_price = add_apple_orange_layer.forward(apple_price, orange_price)
price = mul_tax_layer.forward(apple_orange_price, tax)
# backward
dprice = 1
dall_price, dtax = mul_tax_layer.backward(dprice)
dapple_price, dorange_price = add_apple_orange_layer.backward(dall_price)
dapple, dapple_num = mul_apple_layer.backward(dapple_price)
dorange, dorange_num = mul_orange_layer.backward(dorange_price)
# 输出
print(price)
print(dapple_num, dapple, dorange_num, dorange, dtax)
乘法测试,示例图:
乘法和加法测试,示例图: