我创建了一个定制的DataSetIterator。它的工作方式是在next方法中随机生成两个nexts(一个用于输入,一个用于输出),并在其中创建一个DataSet:
int[][] inputArray = new int[num][NUM_INPUTS];
int[][] expectedOutputArray = new int[num][];
for (int i = 0; i < num; i++) {//just fill the arrays with some data
int sum = 0;
int product = 1;
for (int j = 0; j < inputArray[i].length; j++) {
inputArray[i][j] = rand.nextInt();
sum += inputArray[i][j];
product *= inputArray[i][j];
}
expectedOutputArray[i] = new int[] { sum, product, sum / inputArray[i].length };
}
INDArray inputs = Nd4j.createFromArray(inputArray);//never closed
INDArray desiredOutputs = Nd4j.createFromArray(expectedOutputArray);//never closed
return new DataSet(inputs, desiredOutputs);但是,INDArray实现了AutoClosable和javadoc for close() states
此方法释放此INDArray实例所使用的独占堆外资源。如果INDArray依赖共享资源,则会抛出异常,请注意:此方法无论如何都不安全。
我需要关闭INDArrays?吗?
如果是的话,什么时候需要关闭INDArrays??
我尝试使用了一个使用资源的尝试,但是当在INDArray方法中使用它时,它抛出了一个异常,因为它是关闭的。
发布于 2020-09-15 06:05:21
你真的不需要关闭它们。我们使用javacpp自动处理这个问题。您可以选择关闭它们,但是AutoCloseable是为那些希望更好地控制ndarray内存管理的人实现的。
编辑: Javacpp是我们用来连接到我们维护的用c++和其他库编写的本机库的底层原生集成。我们所有的计算和数据都基于本机代码和堆外内存。close()迫使我们更快地分配那些缓冲区。不过,Javacpp已经内置了自动去分配功能。
https://stackoverflow.com/questions/63884593
复制相似问题