Почему я получаю ошибку сегментации, когда я хочу сделать несколько выводов с помощью C API Tensorflow? - PullRequest
0 голосов
/ 08 мая 2019

Мне нужно использовать C API Tensorflow для выполнения вывода в обученной нейронной сети в формате замороженных графов.Так как мне нужно сделать это 34280 раз (из-за приложения, для которого я его использую) и поскольку команда TF_SessionRun (...) медленная, я хочу сделать все выводы одним вызовом TF_SessionRun (...).К сожалению, я всегда получаю ошибку сегментации.

Я не нашел ни одного примера, как запустить TF_SessionRun с несколькими входами и выходами - поэтому было бы здорово, если бы кто-то мог объяснить мне, где я ошибаюсь!

Спасибо


...

int main()
{
    ...

    const int num_bytes_in = 3*sizeof(float); 
    const int num_bytes_out = 15*sizeof(float);

    int64_t in_dims[] = {1,3};
    int64_t out_dims[] = {1,15};

    float values[3] = {0.0080000000000000f,0.6600000000000000f,0.3980000000000000f};

   ...

    std::vector<TF_Output> inputs;
    std::vector<TF_Tensor*> input_values;

    TF_Operation* input_op = TF_GraphOperationByName(graph,"input_1");
    TF_Operation* input_op2 = TF_GraphOperationByName(graph,"input_1");

    TF_Output input_output = {input_op,0};
    TF_Output input_output2 = {input_op2,0};
    inputs.push_back(input_output);
    inputs.push_back(input_output2);

    TF_Tensor* input = TF_NewTensor(TF_FLOAT, in_dims, 2, values, num_bytes_in, &Deallocator, 0);
    TF_Tensor* input2 = TF_NewTensor(TF_FLOAT, in_dims, 2, values, num_bytes_in, &Deallocator, 0);
    assert(input!=0);
    assert(input2!=0);

    input_values.push_back(input);  
    input_values.push_back(input2);


    std::vector<TF_Output> outputs;

    TF_Operation* output_op = TF_GraphOperationByName(graph,"output_1/BiasAdd");
    TF_Operation* output_op2 = TF_GraphOperationByName(graph,"output_1/BiasAdd");

    TF_Output output_opout = {output_op,0};
    TF_Output output_opout2 = {output_op2,0};
    outputs.push_back(output_opout);
    outputs.push_back(output_opout2);

    std::vector<TF_Tensor*> output_values;

    TF_Tensor* output_value = TF_AllocateTensor(TF_FLOAT, out_dims, 2, num_bytes_out);
    TF_Tensor* output_value2 = TF_AllocateTensor(TF_FLOAT, out_dims, 2, num_bytes_out);

    output_values.push_back(output_value);
    output_values.push_back(output_value2);

    fprintf(stdout,"Running session...\n");
    TF_SessionOptions* sess_opts = TF_NewSessionOptions();

    TF_Session* session = TF_NewSession(graph, sess_opts, status);

    assert(TF_GetCode(status)==TF_OK);


    // Call TF_SessionRun

    TF_SessionRun(session,nullptr,&inputs[0],&input_values[0],inputs.size(),&outputs[0],&output_values[0],outputs.size(),nullptr,0,nullptr,status);



    std::cout << "Successfully ran session!" << std::endl;

    //_________________________________________________________________________________________________________________________________________________________
    // 5: Delete variables

    TF_CloseSession(session,status);
    TF_DeleteSession(session,status);
    TF_DeleteSessionOptions(sess_opts);
    TF_DeleteImportGraphDefOptions(graph_opts);
    TF_DeleteGraph(graph);
    TF_DeleteStatus(status);
    TF_DeleteBuffer(graph_def); 

    ...
    return 0;
}

// external function declaration

TF_Buffer* read_file(const char* file)
{
    FILE *f = fopen(file, "rb");
    fseek(f, 0, SEEK_END);
    long fsize = ftell(f);
    fseek(f, 0, SEEK_SET);  //same as rewind(f);

    void* data = malloc(fsize);
    fread(data, fsize, 1, f);
    fclose(f);

    TF_Buffer* buf = TF_NewBuffer();
    buf->data = data;
    buf->length = fsize;
    buf->data_deallocator = free_buffer;
    return buf;
}

...