如何在Deeplearning4j中使用自定义数据模型?

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


Ada*_*son 5

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