我正在使用 deeplearning4j 构建循环神经网络,我需要创建训练和测试数据集。
the documentation 中提供的所有示例和 example 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)
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 - 如何在deeplearning4j中创建训练和测试DataSetIterators?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54020352/