Как я могу использовать пользовательскую модель данных с Deeplearning4j?

Основная проблема заключается в попытке использовать пользовательскую модель данных для создания DataSetIterator, который будет использоваться в сети deeplearning4j.

Модель данных, с которой я пытаюсь работать, представляет собой java-класс, который содержит кучу двойников, созданных из котировок на определенную акцию, таких как временная метка, открытие, закрытие, максимум, минимум, объем, технический индикатор 1, технический индикатор 2, и т. д. Я запрашиваю интернет-источник, пример, (также несколько другие индикаторы с того же сайта), которые предоставляют строки json, которые я конвертирую в свою модель данных для облегчения доступа и хранения в базе данных sqlite.

Теперь у меня есть список этих моделей данных, которые я хотел бы использовать для обучения сети LSTM, где каждая двойная функция является функцией. Согласно документации Deeplearning4j и нескольким примерам, способ использования обучающих данных заключается в использовании процессов ETL, описанных здесь, чтобы создать DataSetIterator, который затем будет использоваться сетью.

Я не вижу чистого способа преобразовать мою модель данных с использованием любого из предоставленных RecordReaders без предварительного преобразования их в какой-либо другой формат, например CSV или другой файл. Я бы хотел избежать этого, потому что это потребует много ресурсов. Похоже, есть лучший способ сделать этот простой случай. Есть ли лучший подход, который мне просто не хватает?


person Ethan    schedule 17.02.2018    source источник


Ответы (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);

example будет особенно полезен для вас, поскольку он реализует сеть LSTM и имеет настраиваемую реализацию итератора (которая может быть руководством для реализации остальных методов). Кроме того, для получения дополнительной информации о NDArray полезно . Он дает подробную информацию о создании, изменении и доступе к частям NDArray.

person Diego Stéfano    schedule 04.03.2018

deeplearning4j здесь.

Вам не следует создавать итератор набора данных ни при каких, кроме очень специальных настроек. Вы должны использовать datavec. Мы освещаем это во многих местах, от нашей страницы данных vec до наших примеров: https://deeplearning4j.konduit.ai/datavec/overview https://github.com/eclipse/deeplearning4j-examples

Datavec - наша специализированная библиотека для преобразования данных. Вы создаете настраиваемые устройства чтения записей для своего варианта использования. Deeplearning4j по устаревшим причинам имеет несколько специальных итераторов для определенных наборов данных. Многие из них появились до того, как Datavec появился. Мы создали datavec как способ предварительной обработки данных.

Теперь вы используете RecordReaderDataSetIterator, SequenceRecordReaderDataSetIterator (дополнительную информацию см. В нашем javadoc) и их эквиваленты с несколькими наборами данных.

Если вы сделаете это, вам не придется беспокоиться о маскировке, потокобезопасности или обо всем остальном, что связано с быстрой загрузкой данных.

В стороне, я хотел бы знать, откуда у вас возникла идея создать свой собственный итератор, теперь у нас есть прямо в нашем файле readme, чтобы этого не делать. Если вы искали другое место, которое не очевидно, мы хотели бы это исправить.

Изменить: я обновил ссылки на новые страницы. Этот пост сейчас очень старый. См. Новые ссылки здесь:

https://deeplearning4j.konduit.ai/datavec/overview https://github.com/eclipse/deeplearning4j-examples

person Adam Gibson    schedule 04.03.2018
comment
Я не имел в виду, что вы создаете DataSetIterator, но что вы используете процессы ETL (согласно readme) для создания RecordReaders, которые делают это за вас. Моя проблема заключалась в том, что я не мог найти RecordReader, который мог бы обрабатывать мой набор данных (класс, полный двойников). - person Ethan; 23.03.2018
comment
Возможно, вы захотите переработать пример анализа тональности, в котором по-прежнему используется настраиваемый итератор. - person Gili; 20.08.2019
comment
Когда я ищу datavec в примерах deeplearning4j, я ничего не нахожу. Я нашел очень мало примеров RecordReaderDataSetIterator или SequenceRecordReaderDataSetIterator. Ничего подобного новичку, который пытается понять, как они работают. - person MJL; 27.05.2021
comment
Привет, вы комментируете пост трехлетней давности. Я обновил ссылки на соответствующие новые страницы. Если у вас есть более конкретные вопросы, не могли бы вы опубликовать их на stackoverflow или на наших официальных форумах? Мы будем рады помочь вам оттуда. - person Adam Gibson; 28.05.2021