#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