2017-04-20 12 views
2

私はOpenCVとAndroid開発のnoobです。OpenCVのJava APIを使用してニューラルネットワークを実装しようとしています。 ReLUのアクティベーション機能以外に必要な機能がすべて見つかりました。だから私はJavaでこの機能を手動で実装することにしました。私の実装は、Matの要素を1つずつトラバースし、Mat.get()を使用して要素にアクセスし、負の値を変更し、Mat.put()を使用してそれらを書き戻します。OpenCVのAndroid APIを使用してアクティベーション機能を実装する方法は?

for (int i = 0; i < output_dim; i++) { 
    float[] value = new float[1]; 
    input.get(0, i, value); 
    if (value[0] < 0) { 
     value[0] = 0; 
     input.put(0, i, value); 
    } 
} 

私は私のコードをプロファイリングしているし、それは私のReLU機能(getおよびput)全体のネットワーク運用のボトルネックになっているように見えます。私はいくつかの解決策を考えることができますが、どちらが優れているのか、解決策が私より優れているかはわかりません。

  1. 複数の入力を同時に処理するには、ReLUの並列実装を使用します。
  2. ReLUをC++で実装して、行列の要素に簡単にアクセスできるようにします。
  3. どういうわけか、ニューラルネットワークの基本的な構成要素のいくつかを持っているOpenCV's DNN moduleまたはANN_MLPを使用してください。これらのC++実装をJavaコードでどのように使用できるかはわかりませんが、

これらの解決策が良いかどうか、または他の解決策を紹介していただけますか?

答えて

0

私は上記のコードをわずかに修正し、大幅なスピードアップを達成しました。新しいコードスニペットは次のようになります。

float[] values = new float[output_dim]; 
input.get(0, 0, values); 

for (int i = 0; i < output_dim; i++) { 
    if (values[i] < 0) { 
     value[i] = 0; 
    } 
} 

input.put(0, 0, values); 

Javaから個々の要素にアクセスするには時間がかかるようです。

関連する問題