在张量流中创建新操作时指定形状句柄的形状(输出张量的秩问题)



我已经成功编译了OP注册文件,并在仅使用此文件时进行了测试。但是在培训过程中,我试图调用OP中定义的功能,这些错误遇到了,每次都会有所不同:

Segmentation fault (core dumped)

double free or corruption (!prev)
Aborted (core dumped)

ValueError: Shape must be rank 1 but is rank 99648624 for 'x' (op: 'x') with input shapes: [50, 1000, 3].

,请注意上面的数字99648624是不确定的,有时可能是0或任何怪异的数字。

以下是在TensorFlow中注册OP的代码,在其中我将输出的维度指定为(b,200,200,1)

 .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) {
        ::tensorflow::shape_inference::ShapeHandle input
        TF_RETURN_IF_ERROR(c->WithRank(c->input(0), 3, &input));   
        ::tensorflow::shape_inference::ShapeHandle dim2;
        TF_RETURN_IF_ERROR(c->MakeShapeFromShapeTensor(200, &dim2));    
        ::tensorflow::shape_inference::ShapeHandle dim3;
        TF_RETURN_IF_ERROR(c->MakeShapeFromShapeTensor(200, &dim3));    
        ::tensorflow::shape_inference::ShapeHandle dim4;
        TF_RETURN_IF_ERROR(c->MakeShapeFromShapeTensor(1, &dim4));    
        ::tensorflow::shape_inference::ShapeHandle output = c->MakeShape({c->Dim(input, 0), c->Dim(dim2, 0), c->Dim(dim3, 0), c->Dim(dim4, 0)});
        c->set_output(0, output);
        return Status::OK();
    });

预先感谢您!欢迎任何建议!

根据tensorflows源代码中的注释,MakeShapeFromShapeTensor将ID作为输入:

out中返回一个新形状的尺寸来自输入张量 input_idx。张量必须是1维INT32或INT64张量。如果 输入张量为null,然后返回未知的形状。

因此,它将您声明为带有索引input_idx的输入的张量,并试图将其用作形状(而不是使用 c->input(0)的张量,而不是使用张量(。因此,如果您宣布这样的输入:

REGISTER_OP("SomeOp")
        .Input("some_input: float")
        .Input("some_vector: int64")

和Some_Vector是例如(2,2,1(,那么c->MakeShapeFromShapeTensor(1, &dims)将输出到具有尺寸的dims A ShapeHandle(2,2,1(。

因此,您真正想要的是在调用MakeShape时直接设置尺寸:

c->MakeShape({c->Dim(input, 0), 200, 200, 1});

您的错误来自以下事实:在访问无效索引时,在C 中没有执行多次检查,因此它试图加载RAM中的任何值,并将其转换为整数向量。访问此内存adress是不允许的(分段故障(,或者它包含无效的值(损坏(或垃圾(随机高级(。

最新更新