3个问题:
chainer中的grad_outputs是什么?
chainer函数F.transpose中的一个例子,如何解释这个后向代码?
向后def(自我,输入,grad_outputs): gy = grad_outputs [0] inv_axes = self.axes 如果self.axes: axes = tuple(ax.inx.axes中ax的ax%len(self.axes)) inv_axes = tuple(numpy.argsort(axes)) gx = gy.transpose(inv_axes) 返回gx,
假设我想要实现自定义函数,但我的输入[0]和输入[1]具有不同的形状,为了使用差分链规则反向传播,我必须在{{1}中编写以下代码}:
a,b =输入
gy = grad_outputs [0]
返回一个* gy,b * gy
但是,a和b的形状不同,backward
和a * gy
可能会报告错误?形状不匹配乘以?
答案 0 :(得分:0)
*此答案适用于chainer v2, Function
类的内部行为可能会在chainer v3 之后发生变化,以支持可区分的反向传播。
反向传播从最后一层进行到第一层传播其渐变,以便计算每层参数的梯度。
函数的backward
函数接收输出的梯度,需要计算&返回输入梯度。
grad_outputs
是此函数输出的渐变,以数组(numpy
或cupy
)格式显示。F.transpose
的区分也只是一个转置,所以它只是返回输出渐变的转置,gy
。
然而,严格地说,当我们转发计算时指定F.transpose
的转置顺序,此顺序保持为self.axes
,并且在向后计算中需要反向排序。我猜inv_axes
是反向排序的轴,它用于计算输入的梯度,写为gx
。return a * gy, b * gy
。形状无关紧要,每个函数的输入可能不同(以及backward
的返回值)