Eth*_*han 4 java deep-learning lstm deeplearning4j
基本问题是尝试使用自定义数据模型创建要在deeplearning4j网络中使用的DataSetIterator。
我要使用的数据模型是一个Java类,其中包含一堆双打,这些双打是根据特定股票的报价创建的,例如时间戳,开盘价,开盘价,收盘价,高价,低价,交易量,技术指标1,技术指标2等等。我查询一个互联网资源,例如,(还有来自同一站点的其他几个指标)提供了json字符串,我将其转换为数据模型以便于访问并存储在sqlite数据库中。
现在,我有了这些数据模型的清单,我想用它们来训练LSTM网络,每个模型都是一个功能。根据Deeplearning4j文档和一些示例,使用训练数据的方法是使用此处描述的ETL流程创建一个DataSetIterator,然后供网络使用。
我看不到一种干净的方法,无需首先将它们转换为其他格式,例如CSV或其他文件,就可以使用提供的RecordReader转换数据模型。我想避免这种情况,因为它会占用大量资源。似乎会有更好的方法来处理此简单案例。有什么更好的方法我只是想念吗?
小智 5
伊桑!
首先,Deeplearning4j使用ND4j作为后端,因此最终必须将您的数据转换为INDArray对象才能在模型中使用。如果您trianing数据为2个数组双打,inputsArray并且desiredOutputsArray,你可以做到以下几点:
INDArray inputs = Nd4j.create(inputsArray, new int[]{numSamples, inputDim});
INDArray desiredOutputs = Nd4j.create(desiredOutputsArray, new int[]{numSamples, outputDim});
Run Code Online (Sandbox Code Playgroud)
然后,您可以直接使用这些向量训练模型:
for (int epoch = 0; epoch < nEpochs; epoch++)
model.fit(inputs, desiredOutputs);
Run Code Online (Sandbox Code Playgroud)
另外,您可以创建一个DataSet对象并将其用于训练:
DataSet ds = new DataSet(inputs, desiredOutputs);
for (int epoch = 0; epoch < nEpochs; epoch++)
model.fit(ds);
Run Code Online (Sandbox Code Playgroud)
但是,创建自定义迭代器是最安全的方法,特别是在较大的集合中,因为它可以让您更好地控制数据并使事情井井有条。
在您的DataSetIterator实现中,您必须传递您的数据,在next()方法的实现中,您应返回一个DataSet包含下一批训练数据的对象。它看起来像这样:
public class MyCustomIterator implements DataSetIterator {
private INDArray inputs, desiredOutputs;
private int itPosition = 0; // the iterator position in the set.
public MyCustomIterator(float[] inputsArray,
float[] desiredOutputsArray,
int numSamples,
int inputDim,
int outputDim) {
inputs = Nd4j.create(inputsArray, new int[]{numSamples, inputDim});
desiredOutputs = Nd4j.create(desiredOutputsArray, new int[]{numSamples, outputDim});
}
public DataSet next(int num) {
// get a view containing the next num samples and desired outs.
INDArray dsInput = inputs.get(
NDArrayIndex.interval(itPosition, itPosition + num),
NDArrayIndex.all());
INDArray dsDesired = desiredOutputs.get(
NDArrayIndex.interval(itPosition, itPosition + num),
NDArrayIndex.all());
itPosition += num;
return new DataSet(dsInput, dsDesired);
}
// implement the remaining virtual methods...
}
Run Code Online (Sandbox Code Playgroud)
NDArrayIndex您上面看到的方法用于访问的部分INDArray。然后,您可以将其用于培训:
MyCustomIterator it = new MyCustomIterator(
inputs,
desiredOutputs,
numSamples,
inputDim,
outputDim);
for (int epoch = 0; epoch < nEpochs; epoch++)
model.fit(it);
Run Code Online (Sandbox Code Playgroud)
该示例将对您特别有用,因为它实现了LSTM网络,并且具有自定义迭代器实现(可以作为实现其余方法的指南)。另外,有关的更多信息NDArray,这很有帮助。它提供了有关创建,修改和访问的各个部分的详细信息NDArray。
deeplearning4j 创建者在这里。
您不应该在任何 非常特殊的设置中创建数据集迭代器。您应该使用 datavec。我们在很多地方都涵盖了这一点,从我们的数据 vec 页面到我们的示例:https : //deeplearning4j.konduit.ai/datavec/overview https://github.com/eclipse/deeplearning4j-examples
Datavec 是我们用于进行数据转换的专用库。您可以为您的用例创建自定义记录阅读器。出于遗留原因,Deeplearning4j 为某些数据集提供了一些“特殊”迭代器。其中许多是在 datavec 存在之前出现的。我们构建了 datavec 作为预处理数据的一种方式。
现在您使用 RecordReaderDataSetIterator、SequenceRecordReaderDataSetIterator(有关更多信息,请参阅我们的 javadoc)及其多数据集等效项。
如果您这样做,您就不必担心屏蔽、线程安全或其他任何涉及快速加载数据的问题。
顺便说一句,我很想知道您是从哪里得到创建自己的迭代器的想法的,我们现在在自述文件中规定不要这样做。如果您正在寻找的其他地方不明显,我们很乐意解决该问题。
编辑:我已经更新了新页面的链接。这个帖子现在很老了。请在此处查看新链接:
https://deeplearning4j.konduit.ai/datavec/overview https://github.com/eclipse/deeplearning4j-examples
| 归档时间: |
|
| 查看次数: |
1438 次 |
| 最近记录: |