Мне нужно использовать 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;
}