Как структурировать и определить размер Y-меток для прогнозирования многомерных последовательностей с помощью Keras LSTM - PullRequest
0 голосов
/ 17 января 2019

Я работаю над проблемой прогнозирования последовательности, когда мои входные данные имеют размер (numOfSamples, numOfTimeSteps, функции), где каждая выборка независима, количество временных шагов является одинаковым для каждой выборки (после предварительного заполнения длины 0 с использованием керас .pad_sength что я хочу.

Моя первая особенность - это категориальная переменная, закодированная в уникальный int, а вторая - числовая. Я хочу иметь возможность предсказать следующую категориальную переменную, а также соответствующее значение feature2, а затем использовать его для обратной связи в сеть, чтобы предсказать последовательность, пока не будет выведена категория EOS.

Это основной источник, на который я ссылался, чтобы попытаться понять, как создать генератор для использования с keras.fit_generator. [ 1 ]

Нет никакой путаницы в том, как мини-пакет для данных "X" захватывается, но для данных "Y" я не уверен в правильном формате для того, что я пытаюсь сделать. Поскольку я пытаюсь предсказать категорию, я подумал, что однократное векторное представление временного шага t + 1 будет правильным способом кодирования первой функции, я думаю, что в результате получится 4? размерная матрица NumPy ??, но я вроде как заблудился, как иметь дело со второй числовой функцией.

Теперь это приводит меня к вопросам, касающимся архитектуры и того, как структурировать модель, чтобы делать то, что я хочу. Имеет ли смысл следующая архитектура? Я считаю, что чего-то не хватает, чего я не понимаю.

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

model = Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(LSTM(hidden_size, return_sequences=True))
model.add(TimeDistributed(Dense(vocab_size)))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])
model.fit_generator(...) #ill figure this out

Итак, в конце активация softmax может предсказать следующее категориальное значение для feature1. Как мне также вывести значение для feature2, чтобы я мог передать новый прогноз для обеих функций обратно в качестве следующего временного шага? Нужна ли какая-то параллельная архитектура с двумя LSTM, которые каким-то образом объединяются?

Это моя первая попытка сделать что-нибудь с нейронными сетями или с Keras, и я бы не сказал, что я "великолепен" в python, но я могу обойтись. Тем не менее, я чувствую, что у меня есть приличное понимание фундаментальных теоретических концепций, но мне не хватает практики.

Этот вопрос, скорее, открыт, с призывом отделить мою текущую стратегию.

Еще раз, общая цель состоит в том, чтобы предсказать обе функции (категориальные, числовые), чтобы предсказать "полные последовательности" из последовательностей промежуточной длины.
Ex. Я тренируюсь на этих дополненных последовательностях max-len, но в процессе производства я хочу использовать это для прогнозирования оставшейся части в настоящее время невидимых временных шагов, которая будет иметь переменную длину.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Практически каждый ответ, который я искал, был приведен в качестве примера и объяснен в этом уроке. Абсолютно отличный ресурс для понимания того, как моделировать сети с несколькими выходами. Этот проходит длинный обход архитектуры с несколькими выходами CNN. Однако мне понадобилось около трех недель, чтобы наткнуться на них.

https://www.pyimagesearch.com/2018/06/04/keras-multiple-outputs-and-multiple-losses/

0 голосов
/ 17 января 2019

Хорошо, поэтому, если я вас правильно понимаю (поправьте меня, если я ошибаюсь), вы хотели бы предсказать следующие функции на основе текущих.

Когда дело доходит до категориальных переменных, вы находитесь в точке, ваш слой Dense должен выдавать вектор N-1, содержащий вероятность каждого класса (пока мы на нем, если вы, случайно, используете панд) .get_dummies не забудьте указать аргумент drop_first=True, подобный подход должен применяться независимо от того, что вы используете для быстрого кодирования).

Кроме этих выходных векторов N-1 для каждой выборки, для числового значения следует вывести еще одно число.

Не забудьте выводить логи (без активации, не использовать softmax в конце, как вы в настоящее время). После этого выходные данные сети должны быть разделены на N-1 часть (ваша категориальная особенность) и переданы в функцию потерь, способную обрабатывать логиты (например, в Tensorflow это tf.nn.softmax_cross_entropy_with_logits_v2 , которая применяет численно стабильный softmax для вас) .

Теперь ваш N-й элемент сетевого вывода должен быть передан с другими потерями, вероятно, Mean Squared Error .

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

К сожалению, я не достаточно опытен в Керасе, чтобы помочь вам с кодом , но я думаю, вы сами разберетесь. Пока мы на этом, я хотел бы предложить PyTorch для более пользовательских нейронных сетей (я думаю, что ваша соответствует этому описанию), хотя это определенно выполнимо и в Keras, ваш выбор.

Дополнительная «возможно полезная» мысль : вы можете проверить Учитель принуждает для вашего рода задач. Подробнее о теме и теории, лежащей в ее основе, можно найти в выдающейся книге Deep Learning Book и примере кода (хотя и в PyTorch еще раз), которые можно найти в их документах здесь .

Кстати интересная идея , не возражаете, если я воспользуюсь ею в связи с моей текущей исследовательской траекторией (конечно, с уважением к вам)? Прокомментируйте этот ответ, если мы можем обсудить его в чате.

...