文章 "神经网络变得轻松(第五部分):OpenCL 中的多线程计算" - 页 4

 
是否可以用 OpenCL 制作 LSTM 网络?如果可以,哪个版本的 NeuroNet.mqh 更好?使用这篇文章中的版本时,我得到的错误信息是 "Error of execution kernel CaclOutputGradient: 0"。而使用第 7 条中 的版本时,如果创建 defNeuronLSTM 神经元,似乎根本用不到 OpenCL。而且 defNeuronLSTMOCL 也没有实现。
Нейросети — это просто (Часть 7): Адаптивные методы оптимизации
Нейросети — это просто (Часть 7): Адаптивные методы оптимизации
  • www.mql5.com
В предыдущих статьях мы рассмотрели разные типы нейронов, но всегда использовали метод стохастического градиентного спуска для обучения нейронной сети. Данный метод, наверное, можно назвать базовым и различные его вариации очень часто используются на практике. Тем не менее, он не единственный и существует целый ряд других методов для обучения...
 
Ivan Titov:
是否可以用 OpenCL 制作 LSTM 网络?如果可以,哪个版本的 NeuroNet.mqh 更好?使用这篇文章中的版本会出现错误 "Error of execution kernel CaclOutputGradient: 0"。而使用第 7 条中 的版本时,如果创建 defNeuronLSTM 神经元,似乎根本用不到 OpenCL。而且 defNeuronLSTMOCL 也没有实现。
目前,LSTM 还没有翻译成 OpenCL。我计划在不久的将来完成这项工作。
 
我明白了,谢谢。还请澄清:recentAverageSmoothingFactor = 10000 - 它的设置很死板。我是否应该根据训练样本中值的数量来改变它?
 
Ivan Titov:
我明白了,谢谢。还请澄清:recentAverageSmoothingFactor = 10000 - 设置得很死板。是否应该根据训练样本中值的数量来改变它?

如果样本较少,就应该减少。如果您想查看整个样本的误差,那么增加它是有意义的。
,我使用一个刚性值来评估不同市场条件 下的网络性能。

 

德米特里,我不明白为什么数组中的值没有更新。没有错误,也没有 false 退出方法。你能自己检查一下吗?

bool CNeuronBaseOCL::calcOutputGradients(CArrayDouble *Target)
  {
   if(CheckPointer(OpenCL)==POINTER_INVALID || CheckPointer(Target)==POINTER_INVALID)
      return false;
   uint global_work_offset[1]= {0};
   uint global_work_size[1];
   global_work_size[0]=Target.Total();
   for(uint i=0; i<global_work_size[0]; i++)
     {
      double z=Target.At(i);                    //<-- 目标数组有三个值 (1,0;0.0;0.0;0.0)
      if(!Gradient.Update(i,Target.At(i)))
         return false;
     }
                                                //更新后检查梯度数组中的值
   double target[];                             
   if(getGradient(target)<Gradient.Total())     //<--目标数组中有三个值 (0,0;0.0;0.0;0.0)
      return false;
//---
   Gradient.BufferWrite();
......
 }
 
Aleksei Lesnikov:

德米特里,我不明白为什么数组中的值没有更新。没有错误,也没有 false 退出方法。你能自己检查一下吗?

阿列克谢,更新方法继承自CArrayDouble 类,并将数据写入数组,但不会将其传递给 GPU 缓冲区。

if(!Gradient.Update(i,Target.At(i)))
         return false;

同时,当调用 getGradient 方法时,它会从 GPU 缓冲区读取数据,从而覆盖之前所做的更改。

virtual int       getGradient(double &values[])    {  return Gradient.GetData(values);    }
.......
int CBufferDouble::GetData(double &values[])
  {
   if(!BufferRead())
      return false;
   return ArrayCopy(values,m_data,0,0,m_data_total);
  }
 
Dmitriy Gizlyk:

阿列克谢,更新方法继承自CArrayDouble 类,并将数据写入数组,但不会将数据传递给 GPU 缓冲区。

同时,当调用 getGradient 方法时,它会从 GPU 缓冲区读取数据,从而覆盖之前所做的更改。

的确,我犯了一个错误。谢谢。
 

感谢您的这些文章!我对 LSTM 模块非常感兴趣。

我对 LSTM 模块非常感兴趣,有没有办法将 Open-CL 用于 LSTM 网络?

我一直在尝试修改 LSTM-EA 以使用 Open-CL,但没有成功。

致以最诚挚的问候

庞图斯

 
<br/ translate="no">
我应该在哪里安装 .cl 文件?
 
pennyhunter #:
我应该在哪里安装 .cl 文件?

您好,您不需要安装 .cl 文件。您只需将其加载到主程序中,如字符串