当前位置: 首页> 娱乐> 影视 > 龙岩网站推广公司_销售找客户的方法_app营销策划方案_seo有名气的优化公司

龙岩网站推广公司_销售找客户的方法_app营销策划方案_seo有名气的优化公司

时间:2025/7/15 11:23:37来源:https://blog.csdn.net/m0_65639009/article/details/146079050 浏览次数:0次
龙岩网站推广公司_销售找客户的方法_app营销策划方案_seo有名气的优化公司

上一篇文章介绍了反向传播的自动化,但也存在一些问题,本章用于说明这些问题,并修改原有框架,使其支持复杂计算图的运行:

问题一:重复使用一个变量,梯度不会累计

也就是说,反向传播时gx=[1,1],f.inputs=[x,x],在循环中第二次赋值把第一次赋的值给覆盖了。

如何解决

问题二:重复计算导数,梯度不会自动清零

第一次计算,x的导数是2,第二次计算x的导数是3。但是两次的导数值累加了。

设置x.cleargrad() 手动清空梯度

问题三:不支持复杂计算图

循环funs中的函数
0(初始化)[D]
1[B,C]
2[B,A]
3[B]
4[A]
5[ ]

如何解决

代码验证

完整代码

import numpy as npclass Variable:def __init__(self, data):if data is not None:if not isinstance(data, np.ndarray):raise TypeError('{} is not supported'.format(type(data)))self.data = dataself.grad = Noneself.creator = Noneself.generation = 0def set_creator(self, func):self.creator = funcself.generation = func.generation + 1def cleargrad(self):self.grad = Nonedef backward(self):if self.grad is None:self.grad = np.ones_like(self.data)funcs = []seen_set = set()def addfunc(f):if f not in seen_set:funcs.append(f)seen_set.add(f)funcs.sort(key=lambda x: x.generation)#funcs按照从小到大的辈分排序addfunc(self.creator)while funcs:f = funcs.pop()gys = [output.grad for output in f.outputs]  # 获取所有输出的梯度gxs = f.backward(*gys)                       # 调用 backward 方法if not isinstance(gxs, tuple):               # 确保 gxs 是元组gxs = (gxs,)for x, gx in zip(f.inputs, gxs):            # 为每个输入分配梯度if x.grad is None:x.grad = gxelse:x.grad = x.grad + gxif x.creator is not None:addfunc(x.creator)class Function:def __call__(self, *inputs):xs = [x.data for x in inputs]               # 提取输入数据ys = self.forward(*xs)                      # 前向传播(解包)if not isinstance(ys, tuple):               # 确保 ys 是元组ys = (ys,)outputs = [Variable(as_array(y)) for y in ys]  # 创建输出变量self.generation = max([x.generation for x in inputs])for output in outputs:output.set_creator(self)self.inputs = inputs                        # 保存输入self.outputs = outputs                      # 保存输出return outputs if len(outputs) > 1 else outputs[0]  # 根据输出数量返回def forward(self, *xs):raise NotImplementedError()def backward(self, *gys):raise NotImplementedError()# 实现具体的函数类
class Square(Function):def forward(self, x):return x ** 2def backward(self, gy):x = self.inputs[0].data                     # 从 inputs 中获取数据gx = 2 * x * gyreturn gxclass Add(Function):def forward(self, x0, x1):y = x0 + x1return ydef backward(self, gy):return gy, gy                               # 对两个输入返回相同的梯度# 定义便捷函数
def square(x):return Square()(x)def add(x0, x1):return Add()(x0, x1)# 定义 as_array 函数
def as_array(x):if np.isscalar(x):return np.array(x)return xx = Variable(np.array(2.0))
a = square(x)
y = add(square(a) , square(a))
y.backward()
print(y.data)
print(x.grad)
'''
# 测试代码
x = Variable(np.array(2.0))
y = Variable(np.array(3.0))
z = add(square(x), square(y))
z.backward()
print(z.data)    # 输出结果: 13.0 (2^2 + 3^2 = 4 + 9 = 13)
print(x.grad)    # 输出梯度: 4.0 (dz/dx = 2 * 2 = 4)
print(y.grad)    # 输出梯度: 6.0 (dz/dy = 2 * 3 = 6)
'''

运行结果:

下一章将会深入实践深度学习中的内存管理部分,掌握代码技术

关键字:龙岩网站推广公司_销售找客户的方法_app营销策划方案_seo有名气的优化公司

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: