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

时间:2019-01-03 10:23:18

标签: deeplearning4j

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

the documentationexample code中提供的所有示例均使用CSVSequenceRecordReader读取CSV文件。

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

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

我如何:

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

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

修改

我认为我的问题太广泛了。让我尝试缩小范围。

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

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

使用network.fit(dataSet);训练数据是可行的,但是我不能在训练时评估它,因为方法evaluate需要数据集迭代器,而不是数据集。

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

我还猜想我可以使用batchBy(int num)方法从这个大数据集中创建迷你批。但是此方法返回数据集列表,而不是数据集迭代器... iterateWithMiniBatches()确实返回了数据集迭代器,但是当我查看源文件时,它返回null并已弃用。然后,我尝试查看是否可以使用DataSetIterator的实现,但是有很多实现。我尝试了BaseDataSetIterator,但它没有将DataSet用作构造函数参数,而是将DataSetFetcher用作...另外一层。

是否有一个示例显示了如何在不使用默认记录读取器的情况下创建数据集?还是我应该创建记录读取器的实现方式?

1 个答案:

答案 0 :(得分:1)

1)

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

如果您有List<Data> object,则可以先将其映射到double[] featureVectordouble[] 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);

评估您的网络