Как правильно сформировать 2D-вход и выход для LSTM в Керасе (тензор потока)? Генерация ошибки при вводе 3D и выводе одного горячего кодирования - PullRequest
2 голосов
/ 09 июля 2019

Для проекта класса мы должны взять набор 2D-данных и использовать LSTM NN для прогнозирования.Мы сравниваем его с простым DNN.

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

Мой x_train.shape равен (2340, 590), а моя y форма (2340,).

Я изменил x_train на (1, 2340, 590)

I, один код в горячем видеy - который называется binary_labels

binary_labels.shape равен (2340,2)

Обобщение соответствующих форм ввода:

x_train.shape = (1, 2340, 590)

binary_labels.shape = (2340, 2)

Проблема:

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

Я попытался изменить binary_labels на (1,2340,2) -но при запуске NN я получаю ValueError:

Пустые данные о тренировках.

rnn_model = keras.Sequential([
        keras.layers.LSTM(2, input_shape=(X_train.shape[1], X_train.shape[2]), return_sequences = True),
        keras.layers.LSTM(590, return_sequences = True, activation=tf.nn.relu),
        keras.layers.LSTM(590, return_sequences = True, activation=tf.nn.relu),
        keras.layers.LSTM(590, return_sequences = True, activation=tf.nn.relu),
        keras.layers.Dense(2, activation='sigmoid')
    ])

rnn_model.compile(optimizer='adam', 
          loss='binary_crossentropy',
          metrics=['accuracy'])

rnn_model.fit(X_train, binary_labels, epochs=5, validation_split = 0.2)

Я ожидаю, что модель будет работать!Вместо этого я получаю сообщение об ошибке, которое не могу решить.

Кто-нибудь имеет представление о том, как я могу это исправить?

Соответствующая часть сообщения об ошибке:

ValueError: Входные массивы должныиметь то же количество образцов, что и целевые массивы.Найдено 1 входных выборок и 2340 целевых выборок

Полное сообщение об ошибке:

--------------------------------------------------------------------------- ValueError Traceback (последний вызов был последним) в 11 метриках = ['precision']) 12 ---> 13 rnn_model.fit (X_train, binary_labels, epochs = 5, validation_split = 0.2)

~ / Desktop / Program_Downloads / anaconda3 / envs / uwdatasci420 / lib / python3.6 / site-packages / tenorflow / python / keras / engine / training.py в нужном состоянии (self, x, y, batch_size), эпохи, многословные, обратные вызовы, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, рабочие, use_multiprocessing, ** kwargs) 64-й областиНет, эпоха будет работать до тех пор, пока не будет исчерпан входной набор данных.-> 643 validation_steps: релевантно, только если указано validation_data и 644 является итератором набора данных или набора данных.Общее количество шагов (пакетов по 645 образцов), которые нужно нарисовать перед остановкой при выполнении проверки

~ / Desktop / Program_Downloads / anaconda3 / envs / uwdatasci420 / lib / python3.6 / site-packages / tenorflow / python / keras/engine/training_arrays.py в соответствии (self, model, x, y, batch_size, эпохи, подробный, обратные вызовы, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq * 1067, k67, **)

~ / Desktop / Program_Downloads / anaconda3 / envs / uwdatasci420 / lib / python3.6 / site-packages / tenorflow / python / keras / engine / training.py в _standardize_user_data (self, x, y, sample_weight, class_weight, batch_size), check_steps, steps_name, steps, validation_split, shuffle, extract_tensors_from_dataset) 2463, если не self.inputs: 2464

Нам нужно использовать x_input для установки входов модели.

-> 2465 2466# Если входными данными является итератор набора данных в графическом режиме или если это нетерпеливый итератор 2467 # и только одна партия выборокТребуется, мы извлекаем данные

~ / Desktop / Program_Downloads / anaconda3 / envs / uwdatasci420 / lib / python3.6 / site-packages / tenorflow / python / keras / engine / training_utils.py в check_array_lengths (входные данные, target, weight) 617 "" "618 batch_count = int (len (index_array) / batch_size) -> 619 #, чтобы изменить форму, мы должны быть чисто делимыми на размер пакета 620 # мы прячем дополнительные элементы и повторно добавляем их после перетасовки621 last_batch = index_array [batch_count * batch_size:]

ValueError: входные массивы должны иметь то же количество выборок, что и целевые массивы. Найдено 1 входных образцов и 2340 целевых образцов

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Я думаю, что завершение вашего последнего Dense слоя в keras.layers.TimeDistributed решит проблему для вас.

    # ...
    keras.layers.LSTM(590, return_sequences=True, activation=tf.nn.relu),
    keras.layers.TimeDistributed(keras.layers.Dense(2, activation='sigmoid'))
]

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

    # ...
    keras.layers.LSTM(590, return_sequences=False, activation=tf.nn.relu),
    keras.layers.Dense(2, activation='sigmoid')
]

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

0 голосов
/ 09 июля 2019

Если я хорошо понимаю ваш вопрос, вот проблема:

x_train.shape равно (2340, 590), поэтому у вас есть 2340 образцов размера (590,)
Если вы измените свои данные так, как вы это сделали: (1, 2340, 590), вы предоставите только одну выборку размером (2340, 590), потому что форма ввода модели keras определяется следующим образом: (Batch_size, size1, size2)

Итак, чтобы ваша модель работала, вам нужно всего лишь изменить данные:

x_train = np.expand_dims(x_train, -1) #new shape = (2340, 590, 1)

Попробуй и скажи мне, если будет лучше!

...