Я не совсем понимаю, как работает модель.
У меня есть блок текста.Я хочу научить мой 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))
Может быть, это поможет, я не знаю.Модель сейчас тренируется (у меня только процессор, и этот процесс может выполняться несколько раз)