我创建了一个自定义密集对象,以稀疏c ++中的tensorflow op。我还为渐变创建了一个反向的。我在python中注册了它们。但是当我训练时,我的反向运算的输出形状为(0,0),而不是正向运算的输入形状,我不明白为什么。
奇怪的是,我的单元测试有效。
我让我的前向运算从(b,n)形状的密集张量中制作出一个具有density_shape(b,n,k)的稀疏张量,而我的反向运算显然应该做相反的操作(但不这样做)。
这是我用来在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)的张量会导致错误。
任何解决方法或错误可能出自何处的想法都将受到赞赏。