数据结构

以下数据结构用于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_TENSOR

Tensor

ONNX_TYPE_SEQUENCE

Sequence

ONNX_TYPE_MAP

Map

ONNX_TYPE_OPAQUE

Abstract (opaque)

ONNX_TYPE_SPARSETENSOR

Sparse tensor

ENUM_ONNX_DATA_TYPE #

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

ID

描述

ONNX_DATA_TYPE_UNDEFINED

未定义

ONNX_DATA_TYPE_FLOAT

浮点型

ONNX_DATA_TYPE_INT8

8位整型

ONNX_DATA_TYPE_UINT16

16位无符号整型

ONNX_DATA_TYPE_INT16

16位整型

ONNX_DATA_TYPE_INT32

32位整型

ONNX_DATA_TYPE_INT64

64位整型

ONNX_DATA_TYPE_STRING

字符串

ONNX_DATA_TYPE_BOOL

布尔型

ONNX_DATA_TYPE_FLOAT16

16位浮点型

ONNX_DATA_TYPE_DOUBLE

双精度

ONNX_DATA_TYPE_UINT32

32位无符号整型

ONNX_DATA_TYPE_UINT64

64位无符号整型

ONNX_DATA_TYPE_COMPLEX64

64位复数

ONNX_DATA_TYPE_COMPLEX128

128位复数

ONNX_DATA_TYPE_BFLOAT16

16位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类型的数组中

ArrayFromFP16

ushort类型数组复制到给定格式的float或double类型的数组中

ArrayFromFP8

uchar类型数组复制到给定格式的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_E4M3FN

8位浮点数,4位指数,3位尾数。通常用作系数。

FLOAT_FP8_E4M3FNUZ

8位浮点数,4位指数,3位尾数。支持NaN,不支持负零和Inf。通常用作系数。

FLOAT_FP8_E5M2FN

8位浮点数,5位指数,2位尾数。支持NaN和Inf。通常用于渐变。

FLOAT_FP8_E5M2FNUZ

8位浮点数,5位指数,2位尾数。支持NaN,不支持负零和Inf。也用于渐变。

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