Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
shidanila opened this issue May 9, 2018 · 10 comments
Open

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

shidanila opened this issue May 9, 2018 · 10 comments

Comments

@shidanila
Copy link

shidanila commented May 9, 2018

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

@IlyaGusev
Copy link
Owner

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

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

@IlyaGusev
Copy link
Owner

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

@IlyaGusev
Copy link
Owner

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

@vgrivtsov
Copy link

vgrivtsov commented Jun 11, 2018

В 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
Copy link
Owner

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

@vgrivtsov
Copy link

На 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
Copy link
Owner

IlyaGusev commented Jun 11, 2018

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

@vgrivtsov
Copy link

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

@vgrivtsov
Copy link

А не подскажите еще, в чем может быть причина:
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: <Lemma = поить_VERB; GrTag = 38; WordForm = пою; LemmaCase = 1>

@zhukov-msu
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants