Я сделал RNN с keras для генерации текста. Вдохновленный примером, приведенным на официальном сайте , я решил адаптировать его для французской поэзии и сделать предсказание слово за словом вместо посимвольно .
1) Я создал обучающие примеры и метки следующим образом:
Из файла pory-french.txt я составил:
список слов, содержащихся в тексте, например:
words = [...... '\n', '!', ',', '.', ';', ':', 'AFFECTION', 'AIMONS', 'Abandonnant', 'Abandonne' ...]
Токенизированная версия текстового файла с именем new_text , чтобы сделать обучающие примеры (см. ниже), например, этот фрагмент текста:
Un poète est parti sa tombe fermée.
Pas un chant, pas un mot dans cette langue aimée
эквивалентен этому
['Un', 'poète', 'est', 'parti', 'sa', 'tombe', 'fermée','.', '\n', 'Pas', 'un', 'chant', ',', 'pas', 'un', 'mot', 'dans', 'cette', 'langue', 'aimée']
Затем я составил список обучающих примеров и соответствующие метки (обе являются матрицами одноразовых векторов) с помощью этого фрагмента кода:
maxlen = 250 # lenght (<=> number of words) of each training example
step = 30
X = [] # List of all training examples
Y = [] # List all corresponding labels
for i in range(0, len(new_text) - maxlen, step):
X.append(new_text[i: i + maxlen])
Y.append(new_text[i + maxlen])
X =
[
[
[0..010..0] Un
[0..010..0] poète
[0..010..0] est
.....
[0..010..0] langue
[0..010..0] aimée
]
.......
[
[0..010..0] brisant
[0..010..0] ma
[0..010..0] lyre
....
[0..010..0] n'attendait
[0..010..0] pas
]
]
Y = [
[0..010..0] '\n' THIS IS the next caracter that follows the 1st training example
(Un poète est blablabla langue aimée \n)
....
[0..010..0]
]
Y [i ] - это слово, которое следует после X [i] в корпусе (X [i] - это список слов, представляющий отрывок из текста).
2) Я построил RNN следующим образом:
# Parameters
params = {
'batch_size': 12,
'shuffle': True,
'word_indices': word_indices,
'indices_word': indices_word,
'maxlen': maxlen
}
training_generator = DataGenerator(X, Y, **params)
model = Sequential()
model.add(LSTM(128, input_shape=(maxlen, len(words))))
model.add(Dense(len(words), activation='softmax'))
optimizer = RMSprop(learning_rate=0.01)
model.compile(loss='categorical_crossentropy', optimizer=optimizer)
model.fit_generator(generator=training_generator, steps_per_epoch = 6, epochs=22, callbacks=[print_callback])
Когда я запускаю обучение, я вижу две проблемы:
- потеря начинается около 10, и я не знаю, большая она или нет
- иногда сгенерированный текст после каждой эпохи содержит много "\ n", но в pory-french.txt в строке не может быть более 3 "\ n".
Итак, возникают два вопроса:
1) Как вы думаете, общая структура моей RNN правильна ?
2) Как я могу "сказать" сети, что она работает неправильно при генерации более 3 "\ n" подряд?
Надеюсь, я был ясен в своем объяснении, При необходимости я отредактирую сообщение.
Здесь ссылка на мой код на GitHub
Спасибо большое!
Aymeri c