多输出神经网络的梯度
Created by: zylustc
paddle 版本: 1.8.3 对于一个多输出的神经网络,反向过程得到的梯度会对多个输出的梯度进行累加,有什么办法可以直接分别获得多个输出的梯度。就是类似于下面的代码
import paddle.fluid as fluid
import numpy as np
with fluid.dygraph.guard():
value = np.arange(14).reshape(14).astype("float64")
a=fluid.dygraph.to_variable(value)
a.stop_gradient=False
linear = fluid.Linear(14, 5, dtype="float64")
# forward_pre_hook_handle = linear.register_forward_pre_hook(forward_pre_hook)
adam = fluid.optimizer.Adam(parameter_list=linear.parameters())
out = linear(a)
# dx=fluid.dygraph.grad(outputs=out[0],inputs=a,create_graph=True,retain_graph=True, \
# only_inputs=True,allow_unused=False)[0]
# print(dx)
# dx=fluid.dygraph.grad(outputs=out[1],inputs=a,create_graph=True,retain_graph=True, \
# only_inputs=True,allow_unused=False)[0]
# print(dx)
out.backward()
print(a.gradient())
下面只能得到一个14维的向量,而我希望的是分别得到每一个输出对于输入的梯度。目前可行的是用dygraph.grad()分别计算每个输出对于输入的梯度。 但是这样会不会进行了多次重复的反向计算,导致速度变慢?有没有什么其他高效的办法?