如何在 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);
评估您的网络
我正在使用 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);