Вывод модели, обученной тензорному потоку, с использованием ONNX в C ?

#c #tensorflow #onnx #onnxruntime

Вопрос:

Я пытаюсь воссоздать работу, проделанную в этом видео, cppday20 Совместимый ИИ: ONNX и ONNXRuntime на C (М. Арена, М. Верасани).Репозиторий github для демонстрационного кода находится здесь .До сих пор я обучал регрессионную модель с использованием TensorFlow и преобразовал в ONNX для вывода на c . Но созданный сеанс выполнения ONNX не может прочитать входную форму моей модели; входная форма возвращает значение -1.

 Ort::Env env;
Ort::Session session{env,model_path, Ort::SessionOptions{} };

Ort::AllocatorWithDefaultOptions allocator;
auto* inputName = session.GetInputName(0, allocator);
std::cout << "Input name: " << inputName << "n";
auto* outputName = session.GetOutputName(0, allocator);
std::cout << "Output name: " << outputName << "n";
auto inputShape = session.GetInputTypeInfo(0).GetTensorTypeAndShapeInfo().GetShape();
//model has 5 inputs
std::vector<float> inputValues = {1, 2, 3, 4, 5 }; 

// where to allocate the tensors
auto memoryInfo = Ort::MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeCPU);

// create the input tensor (this is not a deep copy!)
auto inputOnnxTensor = Ort::Value::CreateTensor<float>(memoryInfo, 
    inputValues.data(), inputValues.size(), 
    inputShape.data(), inputShape.size());
    
// the API needs the array of inputs you set and the array of outputs you get
array inputNames = { inputName };
array outputNames = { outputName };

// finally run the inference!
auto outputValues = session.Run(
    Ort::RunOptions{ nullptr }, // e.g. set a verbosity level only for this run
    inputNames.data(), amp;inputOnnxTensor, 1, // input to set
    outputNames.data(), 1);                 
 

выход :

 Number of model inputs: 1
Number of model outputs: 1
Input name: input_1
Output name: Identity
tried creating tensor with negative value in shape
 

Есть какие-нибудь предложения, как заставить код вывода работать?

Комментарии:

1. В чем именно заключается содержание inputShape ? Вы можете поделиться ссылкой на свою модель?

2. Это модель ANN, обученная в TF 2, и я тоже пробовал делать то же самое покрытие onnx для сети LSTM, но обе модели показывают одинаковую ошибку gitlab.com/jinu_ml/lstm-predictions

3. Я предоставляю ссылку на модель, rally_lin.onnx и rally_lstm.onnx-это две модели onnx (линейная регрессия и сеть LSTM) ** gitlab.com/jinu_ml/lstm-predictions/-/blob/main/rally_lin.onnx

Ответ №1:

Ваша модель принимает входной тензор формы <unk, 5>, при этом первое измерение неизвестно (обычно для динамического размера пакета), поэтому ожидается, что при вызове <unk, 5>в первом измерении будет -1 session.GetInputTypeInfo(0).GetTensorTypeAndShapeInfo().GetShape() .

введите описание изображения здесь

Прежде чем передавать фактические данные в вашу модель, вам необходимо задать конкретную форму для вашего тензора, в вашем случае вам, возможно, следует вручную установить первое измерение равным 1.

Комментарии:

1. проблема заключается в модели LSTM, и форма none динамически присваивается в tensorflow 2.0, а добавление 1 вручную в качестве первого измерения приводит к ошибке . Lstm_model.png