Я пытаюсь использовать C API TF Lite для циклического выполнения логического вывода, например, я настраиваю интерпретатор и загружаю ему входные данные каждую секунду или около того, чтобы получать прогнозы.
Для этой цели, Я построил libtensorflowlite_c.so
с помощью bazel. Как описано в здесь , я пытаюсь сделать вывод, подобный этому, но внутри for l oop для имитации выполнения cycli c:
#include "tensorflow/lite/c/c_api.h"
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char* argv[]) {
for(int i = 0; i < 3; i++)
{
printf("Iteration: %d\n", i);
float input[49] = { 0.0 };
TfLiteModel* model = TfLiteModelCreateFromFile("model.tflite");
TfLiteInterpreterOptions* options = TfLiteInterpreterOptionsCreate();
TfLiteInterpreterOptionsSetNumThreads(options, 2);
TfLiteInterpreter* interpreter = TfLiteInterpreterCreate(model, options);
TfLiteInterpreterAllocateTensors(interpreter);
TfLiteTensor* input_tensor = TfLiteInterpreterGetInputTensor(interpreter, 0);
TfLiteTensorCopyFromBuffer(input_tensor, input, 49 * sizeof(float));
TfLiteInterpreterInvoke(interpreter);
const TfLiteTensor* output_tensor = TfLiteInterpreterGetOutputTensor(interpreter, 14);
float output[49];
TfLiteTensorCopyToBuffer(output_tensor, output, 49 * sizeof(float));
printf("Output: \n\n");
for (int j = 0; j < 49; j++) {
printf("%d: %f\n", j, output[j]);
}
TfLiteInterpreterDelete(interpreter);
TfLiteInterpreterOptionsDelete(options);
TfLiteModelDelete(model);
}
return 0;
}
Первая итерация работает нормально и что-то возвращает. Но на второй итерации я получаю SegFault при вызове TfLiteTensorCopyToBuffer(output_tensor, output, 49 * sizeof(float));
. Причина в том, что предыдущая функция TfLiteInterpreterGetOutputTensor
возвращает нулевой указатель.
Я ожидал запустить это несколько раз без каких-либо проблем, так как я уничтожаю все старые экземпляры переменных в конце for-l oop и, таким образом, каждый раз запускать интерпретатор fre sh. Очевидно, что это не так.
Может кто-нибудь дать какие-нибудь указания по этому поводу? Кроме того, я знаю, что мне, вероятно, не нужно создавать интерпретатор на каждой итерации, но я хотел убедиться, что все создается заново, когда я начинаю заново.
РЕДАКТИРОВАТЬ:
Я попытался переписать код, чтобы исключить ненужные части из фактического l oop:
#include "tensorflow/lite/c/c_api.h"
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char* argv[]) {
float input[49] = {0.0};
float output[49] = {[0 ... 48] = 2.5};
TfLiteModel* model = TfLiteModelCreateFromFile("VariationalAutoencoder_440.tflite");
TfLiteInterpreterOptions* options = TfLiteInterpreterOptionsCreate();
TfLiteInterpreterOptionsSetNumThreads(options, 2);
TfLiteInterpreter* interpreter = TfLiteInterpreterCreate(model, options);
TfLiteInterpreterAllocateTensors(interpreter);
TfLiteTensor* input_tensor = TfLiteInterpreterGetInputTensor(interpreter, 0);
const TfLiteTensor* output_tensor = TfLiteInterpreterGetOutputTensor(interpreter, 14);
for(int i = 0; i < 3; i++)
{
printf("\nIteration: %d\n", i);
TfLiteTensorCopyFromBuffer(input_tensor, input, 49 * sizeof(float));
TfLiteInterpreterInvoke(interpreter);
TfLiteTensorCopyToBuffer(output_tensor, output, 49 * sizeof(float));
printf("Output: \n");
for (int j = 0; j < 49; j++)
{
printf("%02d: %f\n", j, output[j]);
}
}
TfLiteInterpreterDelete(interpreter);
TfLiteInterpreterOptionsDelete(options);
TfLiteModelDelete(model);
return 0;
}