何时关闭 DL4J INDArrays

When to close DL4J INDArrays

我创建了一个自定义 DataSetIterator。它通过在 next 方法中随机生成两个 INDArray(一个用于输入,一个用于输出)并从中创建一个 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 implements AutoClosable and the javadoc for close() states:

This method releases exclusive off-heap resources uses by this INDArray instance. If INDArray relies on shared resources, exception will be thrown instead PLEASE NOTE: This method is NOT safe by any means

我尝试使用 try-with-resources 但它引发了异常,因为在 fit 方法中使用它时 INDArray 被关闭。

documentation of createFromArray(int[][])好像没有解释这个。

你真的不需要关闭它们。我们使用 javacpp 自动处理这个问题。您可以选择关闭它们,但 AutoCloseable 是为那些希望更好地控制 ndarray 的内存管理的人实现的。

编辑:Javacpp 是我们用来连接到我们维护的用 c++ 和其他库编写的本机库的基础本机集成。我们所有的计算和数据都是基于原生代码和堆外内存。 close() 只是迫使我们更快地取消分配这些缓冲区。不过,Javacpp 已经内置了自动取消分配。