OnnxRun

Execução do modelo ONNX.

bool  OnnxRun(
   long    onnx_handle,  // identificador de sessão
   ulong   flags,        // sinalizadores que descrevem o modo de execução
   ...                   // parâmetros de entrada e saída do modelo
   );

Parâmetros

onnx_handle

[in]  Identificador do objeto da sessão ONNX, criado por meio de OnnxCreate ou OnnxCreateFromBuffer.

flags

[in] Sinalizador de ENUM_ONNX_FLAGS, que descreve o modo de execução – ONNX_DEBUG_LOGS e ONNX_NO_CONVERSION.

...

[in] [out]  Parâmetros de entrada e saída do modelo.

Retorna true se for bem-sucedido, caso contrário, false. Para obter o código de erro chame a função GetLastError.

ENUM_ONNX_FLAGS

Identificador

Descrição

ONNX_DEBUG_LOGS

Saída de registros de depuração

ONNX_NO_CONVERSION

Proibir a autoconversão, usar os dados do usuário como estão

ONNX_COMMON_FOLDER  

Carga do arquivo do modelo a partir da pasta Common/Files, igual em valor ao sinalizador FILE_COMMON

 

Exemplo:

const long                             ExtOutputShape[] = {1,1};    // forma dos dados de saída do modelo
const long                             ExtInputShape [] = {1,10,4}; // forma dos dados de entrada do modelo
#resource "Python/model.onnx" as uchar ExtModel[]                   // modelo em forma de recurso
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int OnStart(void)
  {
   matrix rates;
//--- obtemos 10 barras
   if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10))
      return(-1);
//--- alimentamos com um conjunto de vetores 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);
//--- preenchemos matrizes de normalização
   for(int i=0i<10i++)
     {
      mm.Row(m,i);
      ms.Row(s,i);
     }
//--- normalizamos os dados de entrada
   x_norm-=mm;
   x_norm/=ms;
//--- criamos o modelo
   long handle=OnnxCreateFromBuffer(ExtModel,ONNX_DEBUG_LOGS);
//--- especificamos a forma dos dados de entrada
   if(!OnnxSetInputShape(handle,0,ExtInputShape))
     {
      Print("OnnxSetInputShape failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//--- especificamos a forma dos dados de saída
   if(!OnnxSetOutputShape(handle,0,ExtOutputShape))
     {
      Print("OnnxSetOutputShape failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//--- convertemos dados de entrada normalizados em dados do tipo float
   matrixf x_normf;
   x_normf.Assign(x_norm);
//--- obtemos o resultado do modelo - a previsão de preço
   vectorf y_norm(1);
//--- iniciamos o modelo
   if(!OnnxRun(handle,ONNX_DEBUG_LOGS | ONNX_NO_CONVERSION,x_normf,y_norm))
     {
      Print("OnnxRun failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//--- registramos no log o valor de saída do modelo
   Print(y_norm);
//--- realizamos uma transformação inversa para obter o preço previsto
   double y_pred=y_norm[0]*s[3]+m[3];
   Print("price predicted:",y_pred);
//--- concluímos o trabalho
   OnnxRelease(handle);
   return(0);
  };

Veja também

OnnxSetInputShape, OnnxSetOutputShape