我是 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)是整个网络操作的瓶颈。我可以想到一些解决方案,但我不确定哪个更好,或者是否有比我的更好的解决方案。
- 使用 ReLU 的并行实现一次处理多个输入。
- 在 C++ 中实现 ReLU 以更轻松地访问矩阵的元素。
- 以某种方式使用OpenCV's DNN module或 ANN_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/