跳至内容

数据结构

数据结构

以下数据结构用于ONNX模型的操作:

OnnxTypeInfo

该结构描述了ONNX模型的输入输出参数的类型

struct OnnxTypeInfo
 {
  ENUM_ONNX_TYPE        type;          // 参数类型
  OnnxTensorTypeInfo    tensor;        // 张量描述
  OnnxMapTypeInfo       map;           // 映射描述
  OnnxSequenceTypeInfo  sequence;      // 序列描述
 };

只有张量(ONNX_TYPE_TENSOR)可以作为输入使用。在这种情况下,只有OnnxTypeInfo::tensor字段被填充值,而其他字段(映射和序列)没有定义。

三种OnnxTypeInfo类型(ONNX_TYPE_TENSOR、ONNX_TYPE_MAP或ONNX_TYPE_SEQUENCE)中只有一种可以作为输入使用。相对应的子结构(OnnxTypeInfo::tensor、OnnxTypeInfo::map或OnnxTypeInfo::sequence)根据类型来填充。

OnnxTensorTypeInfo

该结构描述了ONNX模型的输入输出参数中的张量

struct OnnxTensorTypeInfo
 {
  const ENUM_ONNX_DATA_TYPE  data_type;      // 张量中的数据类型
  const long                 dimensions[];   // 张量中的元素数
 };

OnnxMapTypeInfo

该结构描述了ONNX模型的输出参数中获得的映射

struct OnnxMapTypeInfo
 {
  const ENUM_ONNX_DATA_TYPE  key_type;      //密钥类型
  const OnnxTypeInfo&        value_type;    // 值类型
 };

OnnxSequenceTypeInfo

该结构描述了ONNX模型的输出参数中获得的序列

struct OnnxSequenceTypeInfo
 {
  const OnnxTypeInfo&        value_type;     // 序列中的数据类型
 };

ENUM_ONNX_TYPE

ENUM_ONNX_TYPE枚举描述了模型参数的类型

ID描述
ONNX_TYPE_UNKNOWN未知
ONNX_TYPE_TENSORTensor
ONNX_TYPE_SEQUENCESequence
ONNX_TYPE_MAPMap
ONNX_TYPE_OPAQUEAbstract (opaque)
ONNX_TYPE_SPARSETENSORSparse tensor

ENUM_ONNX_DATA_TYPE

ENUM_ONNX_DATA_TYPE枚举描述了所用数据的类型

ID描述
ONNX_DATA_TYPE_UNDEFINED未定义
ONNX_DATA_TYPE_FLOAT浮点型
ONNX_DATA_TYPE_INT88位整型
ONNX_DATA_TYPE_UINT1616位无符号整型
ONNX_DATA_TYPE_INT1616位整型
ONNX_DATA_TYPE_INT3232位整型
ONNX_DATA_TYPE_INT6464位整型
ONNX_DATA_TYPE_STRING字符串
ONNX_DATA_TYPE_BOOL布尔型
ONNX_DATA_TYPE_FLOAT1616位浮点型
ONNX_DATA_TYPE_DOUBLE双精度
ONNX_DATA_TYPE_UINT3232位无符号整型
ONNX_DATA_TYPE_UINT6464位无符号整型
ONNX_DATA_TYPE_COMPLEX6464位复数
ONNX_DATA_TYPE_COMPLEX128128位复数
ONNX_DATA_TYPE_BFLOAT1616位bfloat(大脑浮点)

ENUM_ONNX_FLAGS

ENUM_ONNX_FLAGS枚举描述了模型运行模式

ID描述
ONNX_DEBUG_LOGS输出调试日志
ONNX_NO_CONVERSION禁用自动转换,按原样使用用户数据
ONNX_COMMON_FOLDER加载Common\Files文件夹的模型文件;该值等于FILE_COMMON标识

使用ONNX模型时的数组转换

机器学习任务并不总是需要更高的计算精度。为了加快计算速度,一些模型使用较低精度的数据类型,例如Float16甚至Float8。为了允许用户将相关数据输入到模型中,MQL5提供了四个特殊函数,可将标准MQL5类型转换为特殊的FP16和FP8类型。

函数操作
ArrayToFP16将float或double类型数组复制到给定格式的ushort类型的数组中
ArrayToFP8将float或double类型数组复制到给定格式的uchar类型的数组中
ArrayFromFP16ushort类型数组复制到给定格式的float或double类型的数组中
ArrayFromFP8uchar类型数组复制到给定格式的float或double类型的数组中

这些数组转换函数使用以下枚举中指定的特殊格式。

ENUM_FLOAT16_FORMAT

ENUM_FLOAT16_FORMAT枚举描述了两种FP16类型格式。

ID描述
FLOAT_FP16标准16位格式,也称为half
FLOAT_BFP16特殊的brain float point(大脑浮点)格式

这些格式中的每一种都有其优点和局限性。FLOAT16提供更高的精度,但需要更多的存储和计算资源。另一方面,BFLOAT16在数据处理方面提供了更高的性能和效率,但可能不太准确。

ENUM_FLOAT8_FORMAT

ENUM_FLOAT8_FORMAT枚举描述了四种FP8类型格式。

FP8(8位浮点)是用于表示浮点数的数据类型之一。在FP8中,每个数字由8个数据位表示,通常分为三个部分:符号、指数和尾数。这种格式提供了准确性和存储效率之间的平衡,使其对于需要内存和计算效率的应用程序具有吸引力。

ID描述
FLOAT_FP8_E4M3FN8位浮点数,4位指数,3位尾数。通常用作系数。
FLOAT_FP8_E4M3FNUZ8位浮点数,4位指数,3位尾数。支持NaN,不支持负零和Inf。通常用作系数。
FLOAT_FP8_E5M2FN8位浮点数,5位指数,2位尾数。支持NaN和Inf。通常用于渐变。
FLOAT_FP8_E5M2FNUZ8位浮点数,5位指数,2位尾数。支持NaN,不支持负零和Inf。也用于渐变。

FP8的主要优势之一是其处理大型数据集的效率。通过采用紧凑型数字表示法,FP8减少了内存需求并加速了计算。这对于经常处理大型数据集的机器学习和人工智能应用程序尤其重要。