反向传播时,输出形状为(0,0)

时间:2019-09-22 10:54:21

标签: python c++ tensorflow gradient-descent backpropagation

我创建了一个自定义密集对象,以稀疏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)的张量会导致错误。

任何解决方法或错误可能出自何处的想法都将受到赞赏。

0 个答案:

没有答案