android - 如何使用 OpenCV 的 Android API 实现激活函数?

标签 android opencv neural-network

我是 OpenCV 和 Android 开发新手,我正在尝试使用 OpenCV 的 Java API 实现神经网络。除了 ReLU 激活函数,我已经找到了我需要的所有函数。所以我决定用Java手动实现这个功能。我的实现一个一个遍历Mat的元素,使用Mat.get()访问元素,修改负值,并使用Mat.put()写回。

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. 在 C++ 中实现 ReLU 以更轻松地访问矩阵的元素。
  3. 以某种方式使用OpenCV's DNN moduleANN_MLP具有神经网络的一些基本构建 block 。尽管我不确定如何在我的 Java 代码中使用这些 C++ 实现。

能否请您告诉我这些解决方案中的任何一个是否不错或介绍其他解决方案?

最佳答案

我稍微修改了上面的代码并获得了巨大的加速。新的代码 fragment 如下所示:

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 访问单个元素需要花费很多时间。

关于android - 如何使用 OpenCV 的 Android API 实现激活函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43508243/

相关文章:

java - Fragment中的内存泄漏问题

java - 使用 Parse 时出现 NullPointerException

java - 我怎样才能实现一个简单的 AsyncTaskLoader?

java - 我已经在 Windows 8 中设置了 ndk-build 的路径,但路径中仍然出现错误?

c - C 中的感知器无法训练

android - "Cannot find build.xml"构建Android SDK示例错误

c++ - OpenCV 和凸度缺陷

opencv - 相机姿态估计给出错误结果

java - Encog - 带验证集的 EarlyStoppingStrategy

python - 简单的非面向对象神经网络的成本 "jumping"