Discussão do artigo "Redes Neurais de Maneira Fácil (Parte 5): Cálculos em Paralelo com o OpenCL" - página 4

 
É possível criar uma rede LSTM com OpenCL? Em caso afirmativo, qual versão do NeuroNet.mqh é melhor? Com a versão deste artigo, recebo o erro "Error of execution kernel CaclOutputGradient: 0". E com a versão do artigo 7, parece que o OpenCL não é usado, se você criar neurônios defNeuronLSTM. E o defNeuronLSTMOCL não está implementado.
Нейросети — это просто (Часть 7): Адаптивные методы оптимизации
Нейросети — это просто (Часть 7): Адаптивные методы оптимизации
  • www.mql5.com
В предыдущих статьях мы рассмотрели разные типы нейронов, но всегда использовали метод стохастического градиентного спуска для обучения нейронной сети. Данный метод, наверное, можно назвать базовым и различные его вариации очень часто используются на практике. Тем не менее, он не единственный и существует целый ряд других методов для обучения...
 
Ivan Titov:
É possível criar uma rede LSTM com OpenCL? Em caso afirmativo, qual versão do NeuroNet.mqh é melhor? Com a versão deste artigo, recebo o erro "Error of execution kernel CaclOutputGradient: 0". E com a versão do artigo 7, parece que o OpenCL não é usado, se você criar neurônios defNeuronLSTM. E o defNeuronLSTMOCL não está implementado.
No momento, o LSTM ainda não foi traduzido para o OpenCL. Planejo fazer isso em um futuro próximo.
 
Estou entendendo, obrigado. Esclareça também: recentAverageSmoothingFactor = 10000 - está definido de forma rígida. Devo alterá-lo de acordo com o número de valores na amostra de treinamento?
 
Ivan Titov:
Estou entendendo, obrigado. Esclareça também: recentAverageSmoothingFactor = 10000 - está definido de forma rígida. Ele deve ser alterado de acordo com o número de valores na amostra de treinamento?

Se a amostra for menor, você deve diminuí-la. Faz sentido aumentá-lo se você quiser ver o erro em toda a amostra.
Eu uso um valor rígido para avaliar o desempenho da rede em diferentes condições de mercado.

 

Dmitry, não consigo entender por que os valores da matriz não são atualizados. Não há erros - não há saída do método por false. Você pode verificar isso por si mesmo?

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);                    //<--O array Target tem três valores (1,0;0.0;0.0;0.0;0.0)
      if(!Gradient.Update(i,Target.At(i)))
         return false;
     }
                                                /Verificar os valores na matriz Gradient após a atualização
   double target[];                             
   if(getGradient(target)<Gradient.Total())     //<--Há três valores na matriz de destino (0,0;0,0;0,0;0,0;0,0)
      return false;
//---
   Gradient.BufferWrite();
......
 }
 
Aleksei Lesnikov:

Dmitry, não consigo entender por que os valores da matriz não são atualizados. Não há erros - não há saída do método por false. Você pode verificar isso por si mesmo?

Alexey, o método update herda da classe CArrayDouble e grava dados na matriz, mas não os passa para o buffer da GPU.

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

Ao mesmo tempo, quando o método getGradient é chamado, ele lê os dados do buffer da GPU, o que substitui as alterações feitas 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, o método de atualização herda da classe CArrayDouble e grava dados na matriz, mas não os passa para o buffer da GPU.

Ao mesmo tempo, quando o método getGradient é chamado, ele lê os dados do buffer da GPU, o que substitui as alterações feitas anteriormente.

De fato, cometi um erro. Obrigado.
 

Obrigado por esses artigos! Tem sido muito interessante acompanhar as ideias desse sistema.

Estou muito interessado no módulo LSTM. Existe uma maneira de usar o Open-CL para redes LSTM?

Estou tentando modificar o LSTM-EA para funcionar com o Open-CL, mas sem sucesso.

Atenciosamente

Pontus

 
<br/ translate="no">
Onde devo instalar o arquivo .cl?
 
pennyhunter #:
Onde devo instalar o arquivo .cl?

Olá, você não precisa instalar o arquivo .cl. Basta carregá-lo no programa principal como a string