首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Deeplearning4j中使用自定义数据模型?

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

Stack Overflow用户
提问于 2018-02-17 19:36:48
回答 2查看 3.8K关注 0票数 8

基本问题是试图使用自定义数据模型来创建要在DataSetIterator网络中使用的deeplearning4j

我试图使用的数据模型是一个java类,它包含一组双值,由特定股票的报价(如时间戳、打开、关闭、高、低、容量、技术指标1、技术指示符2等)创建。我查询internet源示例 (也是来自同一站点的其他几个指示符),它提供json字符串,我将这些字符串转换成数据模型,以便更容易地访问并存储在sqlite数据库中。

现在我有了这些数据模型的列表,我想用来训练一个LSTM网络,每一个都是一个特性。根据Deeplearning4j文档和几个示例,使用培训数据的方法是使用所描述的这里过程创建一个DataSetIterator,然后由网络使用。

如果不首先将数据模型转换为其他格式(如CSV或其他文件),我看不到使用任何提供的RecordReaders来转换数据模型的清晰方法。我想避免这样做,因为这样会消耗大量的资源。似乎有一个更好的方法来做这个简单的案例。有没有更好的方法,我只是错过了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-04 17:09:28

伊森!

首先,Deeplearning4j使用ND4j作为后端,因此您的数据最终必须转换为INDArray对象,以便在您的模型中使用。如果您的三重数据是两个双重数组,即inputsArraydesiredOutputsArray,则可以执行以下操作:

代码语言:javascript
复制
INDArray inputs = Nd4j.create(inputsArray, new int[]{numSamples, inputDim});
INDArray desiredOutputs = Nd4j.create(desiredOutputsArray, new int[]{numSamples, outputDim});

然后你可以直接使用这些向量来训练你的模型:

代码语言:javascript
复制
for (int epoch = 0; epoch < nEpochs; epoch++)
    model.fit(inputs, desiredOutputs);

或者,您可以创建一个DataSet对象并将其用于培训:

代码语言:javascript
复制
DataSet ds = new DataSet(inputs, desiredOutputs);
for (int epoch = 0; epoch < nEpochs; epoch++)
    model.fit(ds);

但是创建一个自定义迭代器是最安全的方法,特别是在更大的集合中,因为它使您能够更好地控制数据,并使事情组织起来。

DataSetIterator实现中,您必须传递数据,在实现next()方法时,您应该返回一个包含下一批培训数据的DataSet对象。看起来是这样的:

代码语言:javascript
复制
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...

}

上面看到的NDArrayIndex方法用于访问INDArray的部分。现在你可以用它来训练了:

代码语言:javascript
复制
MyCustomIterator it = new MyCustomIterator(
    inputs,
    desiredOutputs,
    numSamples,
    inputDim,
    outputDim);

for (int epoch = 0; epoch < nEpochs; epoch++)
    model.fit(it);

这个例子对您特别有用,因为它实现了一个LSTM网络,并且它有一个自定义迭代器实现(这可以作为实现其余方法的指南)。另外,有关NDArray的更多信息,是有帮助的。它提供了关于创建、修改和访问NDArray部分的详细信息。

票数 9
EN

Stack Overflow用户

发布于 2018-03-04 23:56:24

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48845162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档