Discusión sobre el artículo "Redes neuronales: así de sencillo (Parte 5): Cálculos multihilo en OpenCL" - página 4

 
¿Es posible hacer una red LSTM con OpenCL? En caso afirmativo, ¿qué versión de NeuroNet.mqh es mejor? Con la versión de este artículo me sale el error "Error de ejecución kernel CaclOutputGradient: 0". Y con la versión del artículo 7 parece que OpenCL no se utiliza en absoluto, si se crea defNeuronLSTM neuronas. Y defNeuronLSTMOCL no está implementado.
Нейросети — это просто (Часть 7): Адаптивные методы оптимизации
Нейросети — это просто (Часть 7): Адаптивные методы оптимизации
  • www.mql5.com
В предыдущих статьях мы рассмотрели разные типы нейронов, но всегда использовали метод стохастического градиентного спуска для обучения нейронной сети. Данный метод, наверное, можно назвать базовым и различные его вариации очень часто используются на практике. Тем не менее, он не единственный и существует целый ряд других методов для обучения...
 
Ivan Titov:
¿Es posible hacer una red LSTM con OpenCL? En caso afirmativo, ¿qué versión de NeuroNet.mqh es mejor? Con la versión de este artículo me sale el error "Error de ejecución kernel CaclOutputGradient: 0". Y con la versión del artículo 7 parece que OpenCL no se utiliza en absoluto, si se crea defNeuronLSTM neuronas. Y defNeuronLSTMOCL no está implementado.
Por el momento, LSTM no ha sido traducido a OpenCL todavía. Planeo hacerlo en un futuro próximo.
 
Ya veo, gracias. Por favor, aclare también: recentAverageSmoothingFactor = 10000 - está fijado rígidamente. ¿Debo cambiarlo por el número de valores de la muestra de entrenamiento?
 
Ivan Titov:
Ya veo, gracias. Por favor, aclare también: recentAverageSmoothingFactor = 10000 - está fijado rígidamente. ¿Debería modificarse en función del número de valores de la muestra de entrenamiento?

Si la muestra es más pequeña, debería reducirlo. Tiene sentido aumentarlo si quieres ver el error en toda la muestra.
Utilizo un valor rígido para evaluar el rendimiento de la red en diferentes condiciones de mercado.

 

Dmitry, no entiendo por qué no se actualizan los valores del array. No hay errores - no hay salida del método por false. ¿Puedes comprobarlo por ti mismo?

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);                    //<--La matriz Target tiene tres valores (1,0;0.0;0.0;0.0)
      if(!Gradient.Update(i,Target.At(i)))
         return false;
     }
                                                //Comprueba los valores de la matriz Gradient tras la actualización
   double target[];                             
   if(getGradient(target)<Gradient.Total())     //<--Hay tres valores en la matriz de destino (0,0;0,0;0,0;0,0)
      return false;
//---
   Gradient.BufferWrite();
......
 }
 
Aleksei Lesnikov:

Dmitry, no entiendo por qué no se actualizan los valores del array. No hay errores - no hay salida del método por false. ¿Puedes comprobarlo por ti mismo?

Alexey, el método update hereda de la clase CArrayDouble y escribe los datos en el array, pero no los pasa al buffer de la GPU.

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

Al mismo tiempo, cuando se llama al método getGradient, éste lee datos del buffer de la GPU, lo que sobrescribe los cambios realizados anteriormente.

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:

Alexei, el método update hereda de la clase CArrayDouble y escribe datos en el array, pero no los pasa al buffer de la GPU.

Al mismo tiempo, cuando se llama al método getGradient, éste lee datos del buffer de la GPU, lo que sobrescribe los cambios realizados anteriormente.

Efectivamente, he cometido un error. Gracias.
 

Gracias por estos artículos. Ha sido muy interesante seguir las ideas de este sistema.

Estoy muy interesado en el módulo LSTM, ¿hay alguna manera de utilizar Open-CL para redes LSTM?

He estado intentando modificar el LSTM-EA para que funcione con Open-CL, pero sin éxito.

Saludos cordiales

Pontus

 
<br/ translate="no">
Dónde debo instalar el archivo .cl?
 
pennyhunter #:
¿Dónde debo instalar el archivo .cl?

Hola, no es necesario instalar el archivo .cl. Basta con cargarlo en el programa principal como string