Как я могу адаптировать мою рабочую модель тензорного потока для использования двунаправленного LSTM? - PullRequest
0 голосов
/ 21 января 2020

На данный момент у меня есть модель, которая достигает около 81% точности. Данные, с которыми я работаю, являются последовательными, поэтому я хотел бы попробовать включить двунаправленный слой LSTM, чтобы посмотреть, может ли это немного повысить производительность.

Мои данные представляют собой последовательности букв, например, ABCD , Чтобы передать последовательности через мою модель, я использую горячее кодирование. Так что ABCD может стать:

[ [1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0] ]

Примечание. Последовательности на самом деле состоят из 300 символов, но я хотел, чтобы предыдущий пример был простым, ради вопроса.

Так что на В данный момент моя модель выглядит следующим образом:

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(300, 6)),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(128, activation='tanh'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(64, activation='tanh'),
    keras.layers.Dense(1, activation='sigmoid')
])

Таким образом, форма ввода показывает, что каждая последовательность имеет длину 300 букв, с возможностью выбора из 6 букв. Эта модель работает.

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

Я хочу что-то вроде следующее:

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(300, 6)),
    keras.layers.Bidirectional(LSTM(64)),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(128, activation='tanh'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(64, activation='tanh'),
    keras.layers.Dense(1, activation='sigmoid')
])

I ' Я надеюсь, что кто-то с лучшим пониманием двунаправленного LSTM сможет предложить некоторые рекомендации о том, как это сделать. Спасибо.

1 Ответ

0 голосов
/ 22 января 2020

TL; DR: Удалить Flatten.

Как только вы сделаете слой Flatten, ваш ввод потеряет последовательную структуру. Она преобразует форму b × 300 × 6 в b × 1800, где b - размер вашей партии. Каждый обучающий пример представлен 1800-мерным вектором, без измерения, LSTM будет повторяться.

Я бы также подумал о замене активаций tanh на relu, так что вы хотя бы частично избежите исчезающие градиенты.

...