Правильно ли структурирована эта RNN для генерации текста? Что нужно улучшить? - PullRequest
1 голос
/ 05 мая 2020

Я сделал 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

...