Выходная форма (0, 0) при обратном распространении - PullRequest
0 голосов
/ 22 сентября 2019

Я создал собственную плотную и разреженную опцию для тензорного потока в с ++.Я также создал обратный для градиентов.Я зарегистрировал их в Python.Но когда я тренируюсь, результат моей обратной операции имеет форму (0, 0) вместо формы ввода прямой операции, и я не понимаю, почему.

Что странно, однако то, что моямодульный тест работает.

У меня есть моя прямая операция создания разреженного тензора с плотной формой (b, n, k) из плотного тензора в форме (b, n), и моя обратная операция, очевидно, должна делать обратное (но не't).

Это код, который я использую для регистрации обратной операции в c ++.

REGISTER_OP("MyOpReverse")
        .Input("indices: Tint")
        .Input("values: T")
        .Input("dense_shape: Tint")
        .Output("decoded: T")
        .Attr("T: {bfloat16, float, double}")
        .Attr("Tint: {int32, int64}")
        .SetShapeFn([](InferenceContext *c) {
            ShapeHandle encoded;
            TF_RETURN_IF_ERROR(c->MakeShapeFromShapeTensor(2, &encoded));
            ShapeHandle out;
            TF_RETURN_IF_ERROR(c->Subshape(encoded, 0, 2, &out));
            c->set_output(0, out);
            return Status::OK();
        });

Я ожидаю, что это примет форму (b, n), но, очевидно, это дает(0, 0) при обучении, даже несмотря на то, что прямой ввод был чем-то вроде (b, 10000), b обозначает размер пакета.В Python я регистрирую градиент следующим образом:

@ops.RegisterGradient("MyOp")
def _my_op_grad(op, *grad):
    result = my_op_module.my_op_reverse(*grad)
    return result

, который выводит Тензор формы (0, 0), что приводит к ошибкам.

Любая идея, как это исправить или где ещебудет признана ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...