Я пытаюсь создать автоматический кодер 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 />
Оригинал: '(.) (.) (.) ...', прогноз: '((((((...'
Это просто вопрос обучения или я совершаю здесь какую-то решающую ошибку?