Керас, ЛСТМ.Редкая категориальная кроссентропия - PullRequest
0 голосов
/ 20 февраля 2019

Я не совсем понимаю, как работает модель.

У меня есть блок текста.Я хочу научить мой LSTM NN предсказывать следующее слово в предложении по предыдущим последовательностям.Т.е.: я беру первое слово в предложении word_0, затем предсказываю word_1.Затем с помощью word_0 и word_1 происходит прогнозирование word_2, затем с помощью word_0, word_1, word_2 -> прогнозирование word_3 и т. Д. До конца предложения.

В качестве предварительной обработки я использую Word2Vec и векторизацию всех своих слов, а такжеэто вход для LSTM.Как вы понимаете, я использую 'sparse_categorical_crossentropy' как убыток

Я тренирую свою модель и после тренировки проверяю свои результаты на этих данных (на какой модели обучалась).Я ожидаю, что эта модель будет предсказывать те же предложения, что и в данных обучения. НО ЭТО НЕТ! (в соответствии -> 1 и потеря -> после всех эпох) Что не так или почему мои ожидания не соответствуют действительности?

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

Это предварительно обучено настройками Word2Vec:

pretrained_weights = word_model.wv.syn0
vocab_size, emdedding_size = pretrained_weights.shape

Это подготовить данные:

train_x = np.zeros([len(sentences), max_sentence_len], dtype=np.int32)
train_y = np.zeros([len(sentences)], dtype=np.int32)
for i, sentence in enumerate(sentences):
    for t, word in enumerate(sentence[:-1]):
        train_x[i, t] = word2idx(word)
    train_y[i] = word2idx(sentence[-1])

Где:

def word2idx(word):
    return word_model.wv.vocab[word].index

Этоэто настройки LSTM:

model = Sequential()
model.add(Embedding(input_dim=vocab_size, output_dim=emdedding_size, 
          weights=[pretrained_weights]))
model.add(LSTM(units=emdedding_size, return_sequences=True))
model.add(LSTM(units=emdedding_size))
model.add(Dense(units=vocab_size))
model.add(Activation('softmax')) 
model.compile(optimizer=optimizers.Nadam(lr=0.002, beta_1=0.9, beta_2=0.999, 
              epsilon=None, schedule_decay=0.004), 
              loss='sparse_categorical_crossentropy', metrics=['accuracy'])

UPD 1 : Как я понимаю, слой встраивания не корректен!weights=[pretrained_weights] не правильно.Керас обновлен и в документация новая форма этого.Я попробовал:

model.add(Embedding(input_dim=vocab_size,
           output_dim=emdedding_size,
           embeddings_initializer=initializers.Constant(pretrained_weights),
           trainable=False))

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

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