Модель от последовательности к последовательности не работает хорошо - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь создать автоматический кодер seq2seq, который должен иметь возможность захватывать логику последовательности и восстанавливать ее по векторам состояния. Я использую некоторые примеры последовательностей, чтобы проверить, способна ли модель выполнить очень простую версию задачи. Для этой цели у меня есть последовательности, которые выглядят как «<> <> <> ...» или «(.) (.) (.) ...».

Базовый код модели выглядит так:

n_hidden = 256
emb_dim = 16
n_tokens = 559

#Encoder
enc_inp = Input(shape=(None,))
emb_layer = Embedding(input_dim=n_tokens, output_dim=emb_dim)
enc_emb = emb_layer(enc_inp)
enc_layer = LSTM(n_hidden, return_state=True)
enc, state_h, state_c = enc_layer(enc_emb)

#Decoder
dec_inp = Input(shape=(None,))
dec_emb = emb_layer(dec_inp)
dec_layer = LSTM(n_hidden, return_sequences=True, return_state=True)
dec, _, _ = dec_layer(dec_emb, initial_state=[state_h, state_c])
dense_layer = Dense(n_tokens, activation='softmax')
res = dense_layer(dec)

model = Model([enc_inp, dec_inp], res)
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])


#Models for Inference

#Encoder
encoder_model = Model(enc_inp, [state_h, state_c])

#Decoder
state_inp1 = Input(shape=(n_hidden,))
state_inp2 = Input(shape=(n_hidden,))   
dec, state_h, state_c = dec_layer(dec_emb, initial_state=[state_inp1, state_inp2])
res = dense_layer(dec)

decoder_model = Model([dec_inp] + [state_inp1, state_inp2], [res] + [state_h, state_c])

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

Теперь модель работает не очень хорошо, а только предсказывает первый символ снова и снова, поэтому для:
Оригинал: '<> <> <> ...', прогноз: '<<<<<< ...' <br /> Оригинал: '(.) (.) (.) ...', прогноз: '((((((...'

Это просто вопрос обучения или я совершаю здесь какую-то решающую ошибку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...