2017-04-20 21 views
2

我是OpenCV和Android開發noob,我試圖用OpenCV的Java API實現神經網絡。除了ReLU激活功能之外,我找到了所需的所有功能。所以我決定用Java手動實現這個功能。我的實現逐個遍歷Mat的元素,使用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 and put)是整個網絡操作的瓶頸。我可以想到幾個解決方案,但我不確定哪個更好,或者解決方案比我的更好。

  1. 使用並行實現ReLU一次處理多個輸入。
  2. 在C++中實現ReLU以更容易地訪問矩陣的元素。
  3. 以某種方式使用OpenCV's DNN moduleANN_MLP有一些神經網絡的基本構建模塊。雖然我不確定如何在Java代碼中使用這些C++實現。

能否讓我知道這些解決方案是否有好處或者引入其他解決方案?

回答

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訪問單個元素需要很多時間。