Ошибка: метки и preOutput должны иметь одинаковые формы - PullRequest
0 голосов
/ 14 апреля 2020

Я использую deeplearning4j и получаю эту ошибку. Я очень плохо знаком с dl4j и AI в целом. Я пытаюсь предсказать следующее значение, учитывая 10 предыдущих значений. Я использую LSTM. Я почти уверен, что мне, возможно, придется использовать маскировку, но я не знаю, а сообщество dl4j довольно маленькое. Это очень утомительно. Вот мой код: // Я ранее нормализовал свои данные, так как они варьируются от 3500-6500

 DataSetIterator trainData = new SequenceRecordReaderDataSetIterator(trainFeatures, trainLabels, miniBatchSize,
            1, true, SequenceRecordReaderDataSetIterator.AlignmentMode.EQUAL_LENGTH);
 DataSetIterator testData = new SequenceRecordReaderDataSetIterator(testFeatures, testLabels, miniBatchSize,
            1, true, SequenceRecordReaderDataSetIterator.AlignmentMode.EQUAL_LENGTH);

 MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
            .seed(123)
            .weightInit(WeightInit.XAVIER)
            .updater(new Adam())
            .list()
            .layer(new LSTM.Builder().activation(Activation.TANH).nIn(1).nOut(10).build())
            .layer(new OutputLayer.Builder(LossFunctions.LossFunction.MSE)
                .activation(Activation.RELU).nIn(10).nOut(1).build())
            .build();

        MultiLayerNetwork net = new MultiLayerNetwork(conf);
        net.init();

Это ошибка:

Caused by: java.lang.IllegalArgumentException: Labels and preOutput must have equal shapes: got shapes [5, 1, 1] vs [50, 1]

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

Вот мои объявления trainFeatures и trainLabels

SequenceRecordReader trainFeatures = new CSVSequenceRecordReader(numLinesToSkip, delimiter);
        trainFeatures.initialize(new NumberedFileInputSplit(testAndTrainFeatures + "%d.csv",0,800));
        SequenceRecordReader trainLabels = new CSVSequenceRecordReader(numLinesToSkip, delimiter);
        trainLabels.initialize(new NumberedFileInputSplit(testAndTrainLabels + "%d.csv", 0, 800));

1 Ответ

0 голосов
/ 15 апреля 2020

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

Чтобы это исправить, вы должны обернуть слой LSTM в LastTimestep(...), чтобы в действительности происходило только то, что вы ожидаете.

Однако тогда вы столкнетесь со второй проблемой: ваши метки рассматриваются как последовательности, потому что именно так вы их загружаете. Чтобы сделать ваши метки непоследовательными, вы должны будете применить препроцессор к итератору набора данных следующим образом:

trainData.setPreProcessor(new LabelLastTimeStepPreProcessor());

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

...