当分支条件为1时(使用topk),打印查找fc.w_0@GRAD 返回空,没有正确生成反向梯度
当分钟条件为0是(不适用topk),可以正常工作
def test_topn_grad():
input = fluid.layers.data(name='input', shape=[1], dtype='float32')
fc = fluid.layers.fc(name='fc', input=input, size=10, bias_attr=False)
if 1:
top_fc, top_index = fluid.layers.topk(fc, k=10)
loss = fluid.layers.reduce_sum(input=top_fc)
else:
loss = fluid.layers.reduce_sum(input=fc)
optimizer = fluid.optimizer.SGD(learning_rate=1.0)
opts = optimizer.minimize(loss)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
def find_var(varname):
return [x for x in fluid.default_main_program().list_vars() if x.name == varname]
grad = find_var('fc.w_0@GRAD')
print(grad)
3条答案
按热度按时间6yt4nkrj1#
topk 之前设计放在while op中用来预测的,因此没有反向op。 看你的例子是想用topk选出最大的几个loss,然后进行训练。我问一下相关同学有没有其他的实现方式。
jtw3ybtb2#
有可能某些op 不能反传梯度, 是不是都明确标记出来。 我觉得这种op不会很多。我建议是把所有不能反传的op都查出来,对比tenorflow,看对应op tf里是否可以计算梯度,如果可以建议也加上
另外如果某个网络中间有一些不能反传的op,是不是打个警告啥的?
41zrol4v3#
也许有其他方式可以绕过这个问题, 但如果这个问题是 paddle基础op的一些能力缺失,我建议还是当做一个issue来解决掉。