Diskussion zum Artikel "Neuronale Netze leicht gemacht (Teil 5): Parallele Berechnungen mit OpenCL" - Seite 4

 
Ist es möglich, ein LSTM-Netzwerk mit OpenCL zu erstellen? Wenn ja, welche Version von NeuroNet.mqh ist besser? Mit der Version aus diesem Artikel bekomme ich den Fehler "Error of execution kernel CaclOutputGradient: 0". Und mit der Version aus Artikel 7 scheint es, dass OpenCL überhaupt nicht verwendet wird, wenn man defNeuronLSTM Neuronen erstellt. Und defNeuronLSTMOCL ist nicht implementiert.
Нейросети — это просто (Часть 7): Адаптивные методы оптимизации
Нейросети — это просто (Часть 7): Адаптивные методы оптимизации
  • www.mql5.com
В предыдущих статьях мы рассмотрели разные типы нейронов, но всегда использовали метод стохастического градиентного спуска для обучения нейронной сети. Данный метод, наверное, можно назвать базовым и различные его вариации очень часто используются на практике. Тем не менее, он не единственный и существует целый ряд других методов для обучения...
 
Ivan Titov:
Ist es möglich, ein LSTM-Netzwerk mit OpenCL zu erstellen? Wenn ja, welche Version von NeuroNet.mqh ist besser? Mit der Version aus diesem Artikel bekomme ich den Fehler "Error of execution kernel CaclOutputGradient: 0". Und mit der Version aus Artikel 7 scheint es, dass OpenCL überhaupt nicht verwendet wird, wenn man defNeuronLSTM Neuronen erstellt. Und defNeuronLSTMOCL ist nicht implementiert.
Im Moment wurde LSTM noch nicht in OpenCL übersetzt. Ich plane, dies in naher Zukunft zu tun.
 
Ich verstehe, danke. Bitte klären Sie auch: recentAverageSmoothingFactor = 10000 - er ist starr eingestellt. Soll ich ihn nach der Anzahl der Werte in der Trainingsstichprobe ändern?
 
Ivan Titov:
Ich verstehe, danke. Bitte klären Sie auch: recentAverageSmoothingFactor = 10000 - er ist starr eingestellt. Sollte er durch die Anzahl der Werte in der Trainingsstichprobe geändert werden?

Wenn die Stichprobe kleiner ist, sollten Sie ihn verringern. Es ist sinnvoll, ihn zu erhöhen, wenn Sie den Fehler über die gesamte Stichprobe sehen wollen.
Ich verwende einen starren Wert, um die Leistung des Netzwerks unter verschiedenen Marktbedingungen zu bewerten.

 

Dmitry, ich kann nicht verstehen, warum die Werte im Array nicht aktualisiert werden. Es treten keine Fehler auf - die Methode wird nicht mit false verlassen. Können Sie das selbst überprüfen?

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);                    //<--Das Ziel-Array hat drei Werte (1,0;0.0;0.0;0.0)
      if(!Gradient.Update(i,Target.At(i)))
         return false;
     }
                                                //Prüfen Sie die Werte im Array "Gradient" nach der Aktualisierung
   double target[];                             
   if(getGradient(target)<Gradient.Total())     //<--Es gibt drei Werte im Zielfeld (0,0;0.0;0.0;0.0)
      return false;
//---
   Gradient.BufferWrite();
......
 }
 
Aleksei Lesnikov:

Dmitry, ich kann nicht verstehen, warum die Werte im Array nicht aktualisiert werden. Es treten keine Fehler auf - die Methode wird nicht mit false verlassen. Können Sie dies selbst überprüfen?

Alexey, die Update-Methode erbt von der CArrayDouble-Klasse und schreibt Daten in das Array, übergibt sie aber nicht an den GPU-Puffer.

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

Wenn die getGradient-Methode aufgerufen wird, liest sie gleichzeitig Daten aus dem GPU-Puffer, wodurch die zuvor vorgenommenen Änderungen überschrieben werden.

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, die Aktualisierungsmethode erbt von der Klasse CArrayDouble und schreibt Daten in das Array, übergibt sie aber nicht an den GPU-Puffer.

Wenn die Methode getGradient aufgerufen wird, liest sie gleichzeitig Daten aus dem GPU-Puffer, wodurch die zuvor vorgenommenen Änderungen überschrieben werden.

In der Tat, ich habe einen Fehler gemacht. Vielen Dank!
 

Ich danke Ihnen für diese Artikel! Es war sehr interessant, die Ideen zu diesem System zu verfolgen.

Ich interessiere mich sehr für das LSTM-Modul. Gibt es eine Möglichkeit, Open-CL für LSTM-Netze zu verwenden?

Ich habe versucht, das LSTM-EA so zu modifizieren, dass es mit Open-CL funktioniert, aber ohne Erfolg.

Mit freundlichen Grüßen

Pontus

 
<br/ translate="no">
Wo soll ich die .cl-Datei installieren?
 
pennyhunter #:
Wo soll ich die .cl-Datei installieren?

Hallo, Sie brauchen die .cl-Datei nicht zu installieren. Du lädst sie einfach in das Hauptprogramm als String