Я создал собственную плотную и разреженную опцию для тензорного потока в с ++.Я также создал обратный для градиентов.Я зарегистрировал их в 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), что приводит к ошибкам.
Любая идея, как это исправить или где ещебудет признана ошибка.