gpt4 book ai didi

java - 如何将自定义数据模型与 Deeplearning4j 结合使用?

转载 作者:行者123 更新时间:2023-12-02 02:50:54 25 4
gpt4 key购买 nike

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

我尝试使用的数据模型是一个java类,它包含一堆 double ,这些 double 是根据特定股票的报价创建的,例如时间戳、开盘价、收盘价、最高价、最低价、成交量、技术指标1、技术指标指标2等我查询互联网来源,example ,(还有来自同一站点的其他几个指标),它们提供 json 字符串,我将其转换为数据模型,以便于访问并存储在 sqlite 数据库中。

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

我没有找到一种干净的方法来使用任何提供的 RecordReader 来转换我的数据模型,而无需先将它们转换为其他格式(例如 CSV 或其他文件)。我想避免这种情况,因为它会消耗大量资源。似乎有更好的方法来完成这个简单的案例。有没有更好的方法是我所缺少的?

最佳答案

伊森!

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

INDArray inputs = Nd4j.create(inputsArray, new int[]{numSamples, inputDim});
INDArray desiredOutputs = Nd4j.create(desiredOutputsArray, new int[]{numSamples, outputDim});

然后您可以直接使用这些 vector 训练模型:

for (int epoch = 0; epoch < nEpochs; epoch++)
model.fit(inputs, desiredOutputs);

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

DataSet ds = new DataSet(inputs, desiredOutputs);
for (int epoch = 0; epoch < nEpochs; epoch++)
model.fit(ds);

但是创建自定义迭代器是最安全的方法,特别是在较大的集合中,因为它可以让您更好地控制数据并保持事物井井有条。

在您的 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...

}

您在上面看到的 NDArrayIndex 方法用于访问 INDArray 的部分内容。然后现在您可以使用它进行训练:

MyCustomIterator it = new MyCustomIterator(
inputs,
desiredOutputs,
numSamples,
inputDim,
outputDim);

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

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

关于java - 如何将自定义数据模型与 Deeplearning4j 结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48845162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com