Как я могу использовать пользовательскую модель данных с Deeplearning4j?
Основная проблема - попытка использовать пользовательскую модель данных для создания DataSetIterator для использования в сети deeplearning4j.
Модель данных, с которой я пытаюсь работать, - это Java-класс, который содержит несколько двойных чисел, созданных на основе котировок определенной акции, таких как отметка времени, открытие, закрытие, максимум, минимум, объем, технический индикатор 1, технический индикатор 2, и т. д. Я запрашиваю, например, интернет-источник (также несколько других индикаторов с того же сайта), которые предоставляют строки json, которые я преобразовываю в свою модель данных для более легкого доступа и хранения в базе данных sqlite.
Теперь у меня есть Список этих моделей данных, которые я хотел бы использовать для обучения сети LSTM, каждая из которых является функцией. Согласно документации Deeplearning4j и нескольким примерам, способ использования обучающих данных заключается в использовании описанных здесь процессов ETL для создания DataSetIterator, который затем используется сетью.
Я не вижу чистого способа преобразования моей модели данных с использованием любого из предоставленных RecordReaders без предварительного преобразования их в какой-либо другой формат, такой как CSV или другой файл. Я хотел бы избежать этого, потому что это израсходовало бы много ресурсов. Кажется, что есть лучший способ сделать это простое дело. Есть ли лучший подход, который мне просто не хватает?
2 ответа
Итан!
Прежде всего, Deeplearning4j использует ND4j в качестве бэкэнда, поэтому ваши данные в конечном итоге должны быть преобразованы в INDArray
объекты для использования в вашей модели. Если ваши данные трианирования - это два массива двойных чисел, inputsArray
а также desiredOutputsArray
Вы можете сделать следующее:
INDArray inputs = Nd4j.create(inputsArray, new int[]{numSamples, inputDim});
INDArray desiredOutputs = Nd4j.create(desiredOutputsArray, new int[]{numSamples, outputDim});
И тогда вы можете тренировать свою модель, используя эти векторы напрямую:
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);
Этот пример будет особенно полезен для вас, поскольку он реализует сеть LSTM и имеет собственную реализацию итератора (которая может служить руководством для реализации оставшихся методов). Кроме того, для получения дополнительной информации о NDArray
это полезно. Он дает подробную информацию о создании, изменении и доступе к частям NDArray
,
Создатель deeplearning4j здесь.
Вы не должны ни в каких, но во всех очень специальных настройках создавать итератор набора данных. Вы должны использовать datavec. Мы рассмотрим это во многих местах, начиная с нашей страницы vec для данных и заканчивая нашими примерами: https://deeplearning4j.org/datavec https://github.com/deeplearning4j/dl4j-examples
Datavec - наша специальная библиотека для преобразования данных. Вы создаете собственные программы чтения записей для своего варианта использования. Deeplearning4j по устаревшим причинам имеет несколько "специальных" итераторов для определенных наборов данных. Многие из них появились до появления datavec. Мы создали datavec как способ предварительной обработки данных.
Теперь вы используете RecordReaderDataSetIterator, SequenceRecordReaderDataSetIterator (см. Наш javadoc для получения дополнительной информации) и их эквиваленты нескольких наборов данных.
Если вы сделаете это, вам не придется беспокоиться о маскировке, безопасности потоков или о чем-либо еще, что связано с быстрой загрузкой данных.
Кроме того, я хотел бы знать, откуда у вас идея создать свой собственный итератор, теперь у нас есть право в нашем файле readme этого не делать. Если вы искали другое место, которое неочевидно, мы бы с удовольствием это исправили.