- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
基本问题是尝试使用自定义数据模型来创建要在deeplearning4j中使用的DataSetIterator。网络。
我尝试使用的数据模型是一个java类,它包含一堆 double ,这些 double 是根据特定股票的报价创建的,例如时间戳、开盘价、收盘价、最高价、最低价、成交量、技术指标1、技术指标指标2等我查询互联网来源,example ,(还有来自同一站点的其他几个指标),它们提供 json 字符串,我将其转换为数据模型,以便于访问并存储在 sqlite 数据库中。
现在我有了这些数据模型的列表,我想用它们来训练 LSTM 网络,每个 double 都是一个特征。根据 Deeplearning4j 文档和几个示例,使用训练数据的方法是使用描述的 ETL 过程 here创建一个 DataSetIterator,然后由网络使用。
我没有找到一种干净的方法来使用任何提供的 RecordReader 来转换我的数据模型,而无需先将它们转换为其他格式(例如 CSV 或其他文件)。我想避免这种情况,因为它会消耗大量资源。似乎有更好的方法来完成这个简单的案例。有没有更好的方法是我所缺少的?
最佳答案
伊森!
首先,Deeplearning4j 使用 ND4j 作为后端,因此您的数据最终必须转换为 INDArray
对象才能在您的模型中使用。如果您的 Trianing 数据是两个 double 组:inputsArray
和 desiredOutputsArray
,您可以执行以下操作:
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/
我是一名优秀的程序员,十分优秀!