OnnxRun

运行ONNX模型。

bool  OnnxRun(

   long    onnx_handle,  // ONNX会话句柄

   ulong   flags,        // 描述运行模式的标识

   ...                   // 模型的输入和输出

   );

参数

onnx_handle

[in]  通过OnnxCreateOnnxCreateFromBuffer创建的ONNX会话对象句柄。

flags

[in] ENUM_ONNX_FLAGS中的标识,描述运行模式:ONNX_DEBUG_LOGS和ONNX_NO_CONVERSION。

...

[in] [out]  模型输入和输出。

成功返回true,否则返回false。要获取错误代码,请调用GetLastError函数。

ENUM_ONNX_FLAGS

ID 描述
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[]                   // 作为资源的模型

//+------------------------------------------------------------------+

//| 脚本程序起始函数                                                   |

//+------------------------------------------------------------------+

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=0; i<10; i++)

     {

      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);

     }

//--- 将标准化输入数据转换为浮点类型

   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);

  };

另见

OnnxSetInputShapeOnnxSetOutputShape