gpt4 book ai didi

java - 使用java的stream api进行前馈计算

转载 作者:行者123 更新时间:2023-11-30 02:13:14 25 4
gpt4 key购买 nike

对于我的大学项目,我需要用纯 Java 实现深度学习神经网络。在对应用程序进行分析之后,我想看看使用 java 的流 api 的自动并行化是否会导致性能的显着提高,但我正在努力将我的旧代码转换为基于流的方法。

该方法采用一个 vector ( double 组),执行矩阵乘法,然后将一个值添加到每个元素,最后将 lambda 函数 (DoubleFunction) 应用于每个元素。

这是我要替换的旧代码:

/* e.g.
double[] x = double[100]
int inputNeurons = 100
int outputNeurons = 200
double[][] weights = double[200][100]
double[] biases = double[200]
*/
private double[] output(double[] x) {
double[] y = new double[outputNeurons];

for (int i = 0; i < outputNeurons; i++) {
double preActivation = 0.;
for (int j = 0; j < inputNeurons; j++) {
preActivation += weights[i][j] * x[j];
}
preActivation += biases[i];
y[i] = activation.apply(preActivation);
}
}

这是我到目前为止想到的(它不起作用):

private double[] output(double[] x) {
return Arrays.stream(weights).parallel()
.map(outputNeuron -> IntStream.range(0, outputNeurons)
.mapToDouble(i -> IntStream.range(0, inputNeurons)
.mapToDouble(j -> x[i] * outputNeuron[i]).sum()
).map(activation::apply)
).toArray();

由于我对流了解不够,我真的很感激任何帮助!

最佳答案

很好的尝试,但你的流方法完全不是必要的方法。与命令式方法完全相同的是:

return IntStream.range(0, outputNeurons)
//.parallel() uncomment to see difference in performance
.mapToDouble(i -> IntStream.range(0, inputNeurons)
.mapToDouble(j -> weights[i][j] * x[j]).sum() + biases[i])
.map(activation::apply)
.toArray();

请注意,有很多因素会影响并行流是否会使您的代码比命令式方法或顺序流更快或更慢。因此,在并行之前您需要考虑一些因素。

  • 数据大小
  • 核心数量
  • 每个元素的成本(意味着并行执行所花费的时间以及分解和合并的开销)

  • 源数据结构

  • 打包(意味着基本类型比装箱值的操作速度更快)。
<小时/>

您还应该考虑阅读Should I always use a parallel stream when possible?

关于java - 使用java的stream api进行前馈计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49469336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com