Deeplearning4j LSTM (как) добавить функцию в исходном примере DL4J (UCISequenceClassification)

#machine-learning #artificial-intelligence #lstm #deeplearning4j

Вопрос:

хотите адаптировать deeplearning4j пример UCISequenceClassification: https://github.com/eclipse/deeplearning4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/quickstart/modeling/recurrent/UCISequenceClassification.java. Пример содержит одну функцию с одной меткой. Я хочу использовать этот пример в другом проекте точно так же, но … с дополнительной функцией. Итак, я попытался добавить функцию (только для примера: с постоянным значением 1, которое я добавил в код). Я безуспешно пробовал несколько способов. Кто-нибудь знает, как добавить функцию? Я предполагаю, что мне нужно выбрать другой SequenceRecordReader? Вот моя первая попытка:

Манипулировать вводом — заменить это:

  for (String line : lines) {
        String transposed = line.replaceAll("  ", "n"); // HERE WILL BE THE CHANGE(!!!)

        //Labels: first 100 quickstartexamples (lines) are label 0, second 100 quickstartexamples are label 1, and so on
        contentAndLabels.add(new Pair<>(transposed, lineCount   / 100));
    }
 

Манипулировать входными данными (добавить одну функцию) — с помощью этого:

  for (String line : lines) {
        String transposed = line.replaceAll("  ", "|1n"); // HERE IS THE CHANGE(!!!). I ADD VALUE 1

        //Labels: first 100 quickstartexamples (lines) are label 0, second 100 quickstartexamples are label 1, and so on
        contentAndLabels.add(new Pair<>(transposed, lineCount   / 100));
    }
 

Теперь я пытаюсь добавить эту функцию:
Оригинал:

 SequenceRecordReader trainFeatures = new CSVSequenceRecordReader();       
trainFeatures.initialize(new NumberedFileInputSplit(featuresDirTrain.getAbsolutePath()   "/%d.csv", 0, 449));
 

Мои изменения:

 SequenceRecordReader trainFeatures2 = new CSVMultiSequenceRecordReader("|",Mode.EQUAL_LENGTH); 
trainFeatures2.initialize(new NumberedFileInputSplit(featuresDirTrain.getAbsolutePath()   "/%d.csv", 0, 449));
 

К сожалению, это не работает, потому что он не создает набор данных в правильной форме.

Итак, главный вопрос, который мне нужно решить: как изменить SequenceRecordReader, чтобы включить вторую или несколько функций?Может быть, использовать другой считыватель вместо CSVMultiSequenceRecordReader? Или неправильное использование?

Спасибо за любые подсказки.

(Подсказка: пожалуйста, не комментируйте статическое значение 1 :-). Это должно просто отражать мой пример. Он будет заменен другим значением int, которое имеет смысл)

Ответ №1:

Другая функция будет зависеть от того, какую реализацию чтения записей вы используете. В вашем случае вы используете CSV, что означает, что каждая функция представлена в виде столбца в CSV. Метки похожи.

Вы можете прочитать наши документы здесь для более полного обзора темы: https://deeplearning4j.konduit.ai/deeplearning4j/reference/recurrent-layers

Таким образом, каждый файл представляет временной ряд. Каждый столбец в этом файле представляет функцию. Вам нужно будет сделать то же самое для меток.