2016-11-28 12 views
2

トピックの理解を深めるために、MATLABでニューラルネットワークを実装しました。Matlab GPUバックプロパゲーション

GPUでコードを実行したかったので、すべてのマトリックスをgpuArray()で初期化しましたが、パフォーマンスは向上しませんでした。さらに、GPUがCPUより遅くなることがあります。私はすでにarrayfunpagefunのような機能を使うことを学んだ。 バックプロンプトでは、すべてのレイヤーのデルタエラーを後方に計算するループがforです。しかし、計算には以前の計算の結果が必要であり、*fun()関数でこれを行う方法はわかりません。

私のCPUはi5-3570、私のGPUはGTX 660 Tiです。 私は既にGPUBenchをMATLABでテストしましたが、GPUはCPUよりもx倍高速ですので、間違いは私のコードにあると思います。

TL; DR

どのように私は、GPUコンピューティングのための、このMATLABコードを向上させるのですか?

delta_output = (predicted - NN.Y) .* NN.activationGradient(predicted); 
    delta_hidden(:, :, m) = (delta_output * NN.Theta_output) .* ... 
          NN.activationGradient(NN.a_hidden(:, :, m)); 
    for i = m-1:-1:1 
     delta_hidden(:, :, i) = (delta_hidden(:, 2:end, i+1) * ... 
           NN.Theta_hidden(:, :, i)) .* ... 
           NN.activationGradient(NN.a_hidden(:, :, i)); 
    end 

predictedNN.yNN.Theta_*すべてgpuArrayです。私はすでにdelta_*gpuArrayとして初期化しましたが、何の違いもありません。

+1

GPUコンピューティングへようこそ!まず最初に覚えておいてください:GPUではすべてが高速です。データ量や問題自体などによって異なります。その上に、MATLABはGPUのいくつかのことを行いますが、非常に厄介なGPUプログラミングツールです。 GPUにデータを置くのは遅いですが、そのコード部分のすべてがGPUで実行されていますか?そうでなければ、データを前と後ろに移動し、すべてを遅くすることになります。さらに、その索引付け(例えば、 'NN.activationGradient(NN.a_hidden(:,:、i))')はおそらくコードを遅くするでしょう。 –

答えて

0

ニューラルネットワークにGPUを使用する利点は、各層の更新を一度に計算することから来ているのではなく、本質的にシリアルであることを指摘します。これは、各レイヤーの何千ものニューロンの重みの更新を一度に計算できるからです。

私はGPUを有利に使うために十分な大きさのネットワークを持っていないと思われます。各レイヤーのウェイトマトリックスのサイズはどれくらいですか? 1000以上の要素が含まれていない場合は、CPUが実行している高度に最適化されたマルチコアと本質的にベクトル化された計算よりも、多くの利点があるとは思わないでしょう。

+0

うん、これは問題だった。 :) – Dirk

関連する問題