Paddle topn op 没有优化时,没有正确反传梯度

k2fxgqgv  于 2022-10-20  发布在  其他
关注(0)|答案(3)|浏览(127)

当分支条件为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)
6yt4nkrj

6yt4nkrj1#

topk 之前设计放在while op中用来预测的,因此没有反向op。 看你的例子是想用topk选出最大的几个loss,然后进行训练。我问一下相关同学有没有其他的实现方式。

jtw3ybtb

jtw3ybtb2#

有可能某些op 不能反传梯度, 是不是都明确标记出来。 我觉得这种op不会很多。我建议是把所有不能反传的op都查出来,对比tenorflow,看对应op tf里是否可以计算梯度,如果可以建议也加上
另外如果某个网络中间有一些不能反传的op,是不是打个警告啥的?

41zrol4v

41zrol4v3#

也许有其他方式可以绕过这个问题, 但如果这个问题是 paddle基础op的一些能力缺失,我建议还是当做一个issue来解决掉。

相关问题