为了充分了解 FANN 实现的可能性,读者需要熟悉其文档和最常用的函数。 FANN 的典型用例是创建一个简单的前馈网络,用一些数据训练此网络并运行它。 然后可将已创建并训练过的网络保存到文件中,之后可恢复以备进一步使用。 要创建一个人工神经网络,用户必须使用 fann_create_standard() 函数。赫兹量化软件 我们来看看它的语法:
FANN_EXTERNAL struct fann *FANN_API fann_create_standard(unsigned int num_layers, int lNnum, ... )
其中, num_layers 代表总层数,包括输入和输出层。 lNnum 和以下参数代表各个层(从输入层开始,以输出层结束)中的神经元数量。赫兹量化软件 要创建一个包含一个隐藏层且层中有 5 个神经元、10 个输入和 1 个输出的网络,用户必须进行如下调用:
fann_create_standard(3,10,5,1);
一旦创建了人工神经网络,下一步操作就是使用一些输入和输出数据对其进行训练。 最简单的训练方法是增量训练,可通过以下函数执行:赫兹量化软件
FANN_EXTERNAL void FANN_API fann_train( struct fann * ann, fann_type * input, fann_type * desired_output )
此函数将指针指向之前由 fann_create_standard() 返回的 struct fann 以及输入数据向量和输出数据向量。 输入和输出向量是 fann_type 类型的数组。 该类型事实上是 double 或 float 类型,具体取决于 FANN 的编译方式。 在此实现中,输入和输出向量都将成为 double 数组。赫兹量化软件
一旦人工神经网络训练完成,下一个期望功能将是运行该网络。 函数实现定义如下:
FANN_EXTERNAL fann_type * FANN_API fann_run( struct fann * ann, fann_type * input )
此函数将指针指向 struct fann ,代表之前创建的网络和已定义类型(double 数组)的输入向量。 返回的值是一个输出向量数组。 这个事实是非常重要的,对于一个输出网络,我们始终获得一个带输出值的元素数组,而不是输出值本身。赫兹量化软件
遗憾的是,大部分 FANN 函数使用指向 struct fann 的指针, 代表无法直接由不支持结构作为数据类型的 MQL4 处理的人工神经网络 为了避免该限制,我们必须用某个方法进行一些包装,绕开 MQL4。 最简单的方法是创建一个用于保存正确值的 struct fann 指针数组,并用 int 变量表示的索引来参考它们。 用这种方法,我们可以将不受支持的变量类型替换为受支持类型,并创建一个可以轻松与 MQL4 代码整合的包装库。赫兹量化软件
包装 FANN
据我所知,MQL4 不支持带变量参数列表的函数,所以我们还得解决这个问题。 另一方面,如果调用了带过多参数的 C 函数(变量参数长度)且并未发生任何问题,那么我们可以假定 MQL4 函数中有固定的最大参数数量被传递到 C 库。 结果包装函数如下所示:
/* Creates a standard fully connected backpropagation neural network. * num_layers - The total number of layers including the input and the output layer. * l1num - number of neurons in 1st layer (inputs) * l2num, l3num, l4num - number of neurons in hidden and output layers (depending on num_layers). * Returns: * handler to ann, -1 on error */int __stdcall f2M_create_standard(unsigned int num_layers, int l1num, int l2num, int l3num, int l4num);
我们将先导的 fann_ 更改为 f2M_ (表示 FANN TO MQL),使用静态的参数数量(4 层),返回值现在是人工神经网络的内部数组的索引,其中包含 FANN 操作所需的 struct fann 数据。 用这种方法,我们可以轻松从 MQL 代码中调用此类函数。赫兹量化软件