IlyaGusev / rupo

Библиотека для анализа и генерации стихов на русском языке
Apache License 2.0
177 stars 32 forks source link

Обучение на своём тексте #12

Open shidanila opened 6 years ago

shidanila commented 6 years ago

Можно ли использовать свой текст для обучение? Если да, то где посмотреть информацию по этому поводу? И как запустить выполнение на gpu?

IlyaGusev commented 6 years ago

Да, вообще говоря можно. Для этого текст нужно сначала разметить по частям речи и грамматическим значениям, например с помощью https://github.com/IlyaGusev/rnnmorph. Затем нужно обучить языковую модель, https://github.com/IlyaGusev/rupo/blob/master/rupo/generate/language_model/lstm.py Полученную модель и словарик нужно скормить генератору.

По поводу запуска на GPU - если стоит tensorflow-gpu, он автоматически и подхватится

IlyaGusev commented 6 years ago

В общем я тут хотел для этого ручку в API впилить, но возникли некоторые сложности. rnnmorph с недавних пор на последнем Keras'е. При этом модельки из 2.0.5 и из 2.0.6+ несовместимы из-за какого-то бага. Поэтому чтобы сделать обучение на произвольном корпусе, нужно обновить все старые модельки (читай: переобучить), а это займёт некоторое время. Я думаю к концу недели закончить.

IlyaGusev commented 6 years ago

При этом в dev ветке это будет уже сегодня, можно будет пользоваться :)

vgrivtsov commented 6 years ago

В train_rnn_model model_path что должно быть? engine.train_rnn_model(filenames=f_names, morph_filename='./new_markup_mod.txt', gram_vectorizer_path=GENERATOR_GRAM_VECTORS, word_form_vocabulary_path=GENERATOR_WORD_FORM_VOCAB_PATH, stress_vocabulary_path=GENERATOR_VOCAB_PATH, model_path=GENERATOR_LSTM_MODEL_PATH)

UPD: Сделал файл разметки, потом откатился снова на keras-2.0.5 и закомментил #Morph.get_morph_markup(filenames, morph_filename) вроде пошло, но выходит ошибка: ~/miniconda3/lib/python3.6/site-packages/rupo/generate/prepare/grammeme_vectorizer.py in get_index_by_name(self, name) 127 pos = name.split("#")[0] 128 grammemes = self.__process_tag(name.split("#")[1]) --> 129 return self.name_to_index[pos + "#" + grammemes] 130 131 def __build_vector(self, pos_tag: str, grammemes: List[str]) -> List[int]:

KeyError: 'VERB#Mood=Imp|Number=Sing|Person=2|VerbForm=Fin|Voice=Act'

UPD: А, так оставляем gram_vectorizer_path="" Модель начинает обучение,но выходит ошибка:

AttributeError Traceback (most recent call last)

in () 3 word_form_vocabulary_path=GENERATOR_WORD_FORM_VOCAB_PATH, 4 stress_vocabulary_path=GENERATOR_VOCAB_PATH, ----> 5 model_path=GENERATOR_LSTM_MODEL_PATH) ~/miniconda3/lib/python3.6/site-packages/rupo/api.py in train_rnn_model(self, filenames, morph_filename, gram_vectorizer_path, word_form_vocabulary_path, stress_vocabulary_path, model_path, nn_batch_size, lstm_units, dense_units, embedding_size, softmax_size, external_batch_size, validation_size, validation_verbosity, dump_model_freq, big_epochs) 219 lstm.train([morph_filename, ], validation_size=validation_size, 220 validation_verbosity=validation_verbosity, dump_model_freq=dump_model_freq, --> 221 save_path=model_path, big_epochs=big_epochs) 222 223 def generate_poem(self, ~/miniconda3/lib/python3.6/site-packages/rupo/generate/language_model/lstm.py in train(self, filenames, validation_size, validation_verbosity, dump_model_freq, save_path, start_epoch, big_epochs) 169 if epoch < validation_size: 170 continue --> 171 self.model.fit([lemmas, grammemes, chars], y, batch_size=self.nn_batch_size, epochs=1, verbose=2) 172 173 if epoch != 0 and epoch % validation_verbosity == 0: ~/miniconda3/lib/python3.6/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, **kwargs) 1505 val_f=val_f, val_ins=val_ins, shuffle=shuffle, 1506 callback_metrics=callback_metrics, -> 1507 initial_epoch=initial_epoch) 1508 1509 def evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None): ~/miniconda3/lib/python3.6/site-packages/keras/engine/training.py in _fit_loop(self, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch) 1174 for l, o in zip(out_labels, val_outs): 1175 epoch_logs['val_' + l] = o -> 1176 callbacks.on_epoch_end(epoch, epoch_logs) 1177 if callback_model.stop_training: 1178 break ~/miniconda3/lib/python3.6/site-packages/keras/callbacks.py in on_epoch_end(self, epoch, logs) 75 logs = logs or {} 76 for callback in self.callbacks: ---> 77 callback.on_epoch_end(epoch, logs) 78 79 def on_batch_begin(self, batch, logs=None): ~/miniconda3/lib/python3.6/site-packages/keras/callbacks.py in on_epoch_end(self, epoch, logs) 307 self.log_values.append((k, logs[k])) 308 if self.verbose: --> 309 self.progbar.update(self.seen, self.log_values, force=True) 310 311 AttributeError: 'ProgbarLogger' object has no attribute 'log_values'
IlyaGusev commented 6 years ago

Судя по issue в keras'е (https://github.com/keras-team/keras/issues/3657), такая ошибка возникает, если подаётся пустой массив в качестве обучающей выборки. По умолчанию, engine.train_rnn_model принимает на вход неразмеченные текстовые файлы и сам их размечает. Я бы посоветовал в таком режиме его и использовать. morph_filename (второй аргумент) - путь, куда будет сохранена разметка. keras выше 2.0.5 можно и нужно использовать, с ним не работает текущая модель, а вот новая должна прекрасно обучаться.

vgrivtsov commented 6 years ago

На keras выше 2.0.5 возникает ValueError при попытке запуска engine.train_rnn_model (при этом файл разметки создаётся): ValueError: Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("embedding_1/random_uniform:0", shape=(35, 30), dtype=float32)'

IlyaGusev commented 6 years ago

А можно уточнить версию keras'а и tf? Я тестил на keras==2.1.6, tensorflow==1.8.0, всё ок.

vgrivtsov commented 6 years ago

Перезалил файлы c дропбокса, работает! Спасибо!

vgrivtsov commented 6 years ago

А не подскажите еще, в чем может быть причина: new_markup.txt: 0%| | 0.00/1.35M [00:00<?, ?B/s]Traceback (most recent call last): File "train_fyodor.py", line 22, in model_path=GENERATOR_LSTM_MODEL_PATH) File "/root/miniconda3/lib/python3.6/site-packages/rupo/api.py", line 231, in train_rnn_model save_path=model_path, big_epochs=big_epochs) File "/root/miniconda3/lib/python3.6/site-packages/rupo/generate/language_model/lstm.py", line 163, in train LSTMGenerator.get_validation_data(batch_generator, validation_size) File "/root/miniconda3/lib/python3.6/site-packages/rupo/generate/language_model/lstm.py", line 131, in __get_validation_data for lemmas, grammemes, chars, y in islice(batch_generator, size): File "/root/miniconda3/lib/python3.6/site-packages/rupo/generate/language_model/batch_generator.py", line 121, in iter sentences, next_words = self.__generate_seqs(sentences) File "/root/miniconda3/lib/python3.6/site-packages/rupo/generate/language_model/batch_generator.py", line 54, in generate_seqs if self.word_form_vocabulary.get_word_form_index(word_form) >= self.softmax_size: File "/root/miniconda3/lib/python3.6/site-packages/rupo/generate/prepare/word_form_vocabulary.py", line 66, in get_word_form_index return self.word_form_indices[word_form] KeyError:

zhukov-msu commented 6 years ago

имею то же самое, что и в предыдущем комментарии, не подскажете в чем может быть проблема?