記事についてのディスカッション - ページ 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);                    //<--ターゲット配列は3つの値(1,0;0.0;0.0;0.0)を持つ。
      if(!Gradient.Update(i,Target.At(i)))
         return false;
     }
                                                //更新後にグラデーション配列の値をチェックする
   double target[];                             
   if(getGradient(target)<Gradient.Total())     //<--ターゲット配列には3つの値(0,0;0.0;0.0;0.0)がある。
      return false;
//---
   Gradient.BufferWrite();
......
 }
 
Aleksei Lesnikov:

ドミトリー、なぜ配列の値が更新されないのか理解できない。エラーはありませんし、メソッドからfalseで抜けることもありません。ご自身で確認していただけますか?

Alexey、updateメソッドは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:

Alexeiさん、updateメソッドはCArrayDoubleクラスを 継承し、配列にデータを書き込みますが、GPUバッファには渡しません。

同時に、getGradientメソッドが呼び出されると、GPUバッファからデータを読み込み、先に行われた変更を上書きします。

確かに、私はミスを犯しました。ありがとうございます。
 

これらの記事をありがとう!このシステムのアイデアを追うのはとても興味深いです。

LSTMモジュールにとても興味があるのですが、LSTM-NetworksにOpen-CLを使う方法はありますか?

LSTM-EAをOpen-CLで動作するように修正しようとしていますが、うまくいきません。

よろしくお願いします。

ポンタス

 
<br/ translate="no"> <br/ translate="no">
.clファイルはどこにインストールすればいいですか?
 
pennyhunter #:

.clファイルをインストールする必要はありません。文字列のようにメインプログラムにロードするだけです。