OnnxRun

Запуск модели ONNX на исполнение.

bool  OnnxRun(
   long    onnx_handle,  // хэндл сессии ONNX
   ulong   flags,        // флаги, описывающие режим запуска
   ...                   // входные и выходные параметры модели
   );

Параметры

onnx_handle

[in]  Хэндл объекта сессии ONNX, созданный через OnnxCreate или OnnxCreateFromBuffer.

flags

[in] Флаги из ENUM_ONNX_FLAGS, описывающие режим запуска — ONNX_DEBUG_LOGS и ONNX_NO_CONVERSION.

...

[in] [out]  Входные и выходные параметры модели.

В случае успешного выполнения возвращает true, иначе false. Для получения кода ошибки вызовите функцию GetLastError.

ENUM_ONNX_FLAGS

Идентификатор

Описание

ONNX_DEBUG_LOGS

Вывод логов отладки

ONNX_NO_CONVERSION

Запрет на автоконверсию, использовать данные пользователя как есть

ONNX_COMMON_FOLDER  

Загрузка файла модели из папки Common\Files, по значению равен флагу FILE_COMMON

 

Пример:

const long                             ExtOutputShape[] = {1,1};    // форма выходных данных модели
const long                             ExtInputShape [] = {1,10,4}; // форма входных данных модели
#resource "Python/model.onnx" as uchar ExtModel[]                   // модель в виде ресурса
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int OnStart(void)
  {
   matrix rates;
//--- получаем 10 баров
   if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10))
      return(-1);
//--- подаем на вход набор векторов OHLC
   matrix x_norm=rates.Transpose();
   vector m=x_norm.Mean(0);               
   vector s=x_norm.Std(0);
   matrix mm(10,4);
   matrix ms(10,4);
//--- заполним матрицы нормировки
   for(int i=0i<10i++)
     {
      mm.Row(m,i);
      ms.Row(s,i);
     }
//--- нормируем входные данные
   x_norm-=mm;
   x_norm/=ms;
//--- создаём модель
   long handle=OnnxCreateFromBuffer(ExtModel,ONNX_DEBUG_LOGS);
//--- укажем форму входных данных
   if(!OnnxSetInputShape(handle,0,ExtInputShape))
     {
      Print("OnnxSetInputShape failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//--- укажем форму выходных данных
   if(!OnnxSetOutputShape(handle,0,ExtOutputShape))
     {
      Print("OnnxSetOutputShape failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//--- конвертируем нормированные входные данные в тип float
   matrixf x_normf;
   x_normf.Assign(x_norm);
//--- сюда получим выходные данные модели - предсказание цены
   vectorf y_norm(1);
//--- запускаем модель
   if(!OnnxRun(handle,ONNX_DEBUG_LOGS | ONNX_NO_CONVERSION,x_normf,y_norm))
     {
      Print("OnnxRun failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//--- выведем в лог выходное значение модели
   Print(y_norm);
//--- сделаем обратное преобразование для  получения предсказанной цены
   double y_pred=y_norm[0]*s[3]+m[3];
   Print("price predicted:",y_pred);
//--- завершили работу
   OnnxRelease(handle);
   return(0);
  };

Смотри также

OnnxSetInputShape, OnnxSetOutputShape