如何在 deeplearning4j 中创建训练和测试 DataSetIterators?

How to create training and test DataSetIterators in deeplearning4j?

我正在使用 deeplearning4j 构建循环神经网络,我需要创建训练和测试数据集。

the documentation and the example code中提供的所有示例,使用CSVSequenceRecordReader读取CSV文件。

然后使用 SequenceRecordReaderDataSetIterator 构造函数创建 DataSetIterator 并将其输入 MultiLayerNetwork.fit()MultiLayerNetwork.evaluate() 方法(取决于它是训练数据集迭代器还是测试数据集迭代器).

但是,就我而言,我拥有的数据集并未存储在 CSV 文件中。我通过第三方库在线访问它,对其进行预处理以获得一个List<Data>和一个List<Labels>对象。

我怎样才能:

1) 从我的两个列表创建 DataSetIterator

2) 将 DataSetIterator 拆分为训练集和测试集?

编辑:

我觉得我的问题太宽泛了。让我试着缩小范围。

我已经开始阅读 this article,它使用一种非常简单的方法来创建数据集:

它创建两个 INDArray 并使用 DataSet(INDArray first, INDArray second) 构造函数从它们构建一个数据集。

使用 network.fit(dataSet); 训练数据有效,但我无法在训练时对其进行评估,因为方法 evaluate 需要数据集迭代器,而不是数据集。

此外,据我了解,使用这种方法也意味着只有一个巨大的数据集,没有小批量。

我还猜想我可以使用 batchBy(int num) 方法从这个大数据集创建小批量。但是这个方法 return 是一个数据集列表,而不是数据集迭代器...... iterateWithMiniBatches() 做 return 一个数据集迭代器但是当我查看源文件时,它 return 为 null 且已弃用。然后我试着看看是否有我可以使用的 DataSetIterator 的实现,但它们有很多。我尝试了 BaseDataSetIterator,但它没有将 DataSet 作为构造函数参数,而是将 DataSetFetcher...又一层。

是否有示例说明如何在不使用默认记录 readers 的情况下创建数据集?或者我应该只创建我如何实现记录 reader?

1)

MultiLayerNetwork.evaluate() 接受 ListDataSetIterator 作为参数

如果你有一个 List<Data> object,你可以先将它映射到一个 double[] featureVector 和一个 double[] labelVector,然后像这样创建一个 ListDataSetIterator

    INDArray x = Nd4j.create(featureVector, new int[]{featureVector.length/numberOfFeatures, numberOfFeatures}, 'c');
    INDArray y = Nd4j.create(labelVector, new int[]{labelVector.length/numberOfLabels, numberOfLabels}, 'c');

    final DataSet allData = new DataSet(x,y);

    final List<DataSet> list = allData.asList();

    ListDataSetIterator iterator = new ListDataSetIterator(list);

对于 2),您应该只创建两个单独的迭代器,一个用于训练,一个用于测试。

然后您可以使用 net.evaluate(testIterator);

评估您的网络