Я пытаюсь реализовать чат-бот на основе символов на турецком языке.Я использую пример генерации текста TFLearn по этой ссылке .
Я отредактировал функцию string_to_semi_redundant_sequences
, так как хочу создать чат-бота.Первоначально эта модель создает один символ для последовательности символов, поэтому X сохраняет один горячий вектор последовательности символов каждого входного предложения, а Y сохраняет один горячий вектор одного символа, соответствующий этим последовательностям.Я изменил функцию следующим образом:
def my_string_to_semi_redundant_sequences(inputs, targets,
seq_maxlen, char_idx):
print('Vectorizing text...')
len_chars = len(char_idx)
X = numpy.zeros((len(inputs), seq_maxlen, len_chars), dtype=numpy.bool)
Y = numpy.zeros((len(targets), seq_maxlen, len_chars), dtype=numpy.bool)
for i, seq in enumerate(inputs):
for t in range(seq_maxlen):
if(seq[t] != '0'):
X[i, t, char_idx[seq[t]]] = 1
if(targets[i][t] != '0'):
Y[i, t, char_idx[targets[i][t]]] = 1
Y = Y.reshape([-1, seq_maxlen*len_chars ])
print('Text vectorized.')
print('Total sequences : {:,}'.format(len(targets)))
print('Distinct chars : {:,}'.format(len_chars))
return X, Y
Как видите, мой Y хранит более одного горячо закодированного символа.Он сохраняет цель (предложение) для соответствующего ввода (может рассматриваться как вопрос-ответ).И я изменил Y в [batch_size, seq_maxlen*len_chars]
, думая, что модель будет генерировать символы «seq_maxlen» для формирования предложения.А вот детали моей модели:
maxlen = 50
X, Y = my_string_to_semi_redundant_sequences(inputs, targets,
maxlen, char_idx)
q = tflearn.input_data([None, maxlen, len(char_idx)])
q = tflearn.lstm(q, 128, return_seq=True)
q = tflearn.dropout(q, 0.2)
q = tflearn.lstm(q, 128, return_seq=True)
q = tflearn.dropout(q, 0.2)
q = tflearn.lstm(q, 128)
q = tflearn.dropout(q, 0.2)
q = tflearn.fully_connected(q, maxlen*len(char_idx), activation='softmax')
q = tflearn.regression(q, optimizer='adam',
loss='categorical_crossentropy',
learning_rate=0.001)
m = tflearn.SequenceGenerator(q, dictionary=char_idx,
seq_maxlen=maxlen,
clip_gradients=5.0,
checkpoint_path='model_mentalist')
m.fit(X, Y, validation_set=0.1, batch_size=32, n_epoch=500,
run_id='mentalist', snapshot_epoch=False, snapshot_step=2000)
Длина моего словаря символов составляет 94. И так как я хочу, чтобы модель производила 50 (максленовых) символов, я установил количество единиц maxlen*len(char_idx)
вfully_connected_layer
.
Я обучил модель около 2000 шагов, просто убедитесь, что все в порядке.И я хотел увидеть какой-то результат.Но когда я попытался сгенерировать ответ с:
m.generate(maxlen, temperature=0.5, seq_seed=string))
, я получил эту ошибку:
KeyError Traceback (most recent call last)
<ipython-input-9-fbc4c70d085d> in <module>()
5 string = input('Sen: ')
6 if string != 'çıkış':
----> 7 print('Jane: ' + m.generate(50, temperature=0.5, seq_seed=string))
/usr/local/lib/python3.6/dist-packages/tflearn/models/generator.py in generate(self, seq_length, temperature, seq_seed, display)
216 preds = self._predict(x)[0].tolist()
217 next_index = _sample(preds, temperature)
--> 218 next_char = self.rev_dic[next_index]
219
220 try: #Python 2
KeyError: 3274
Я думаю, что это как-то связано с размерами моих входов (X и Y) и размерность complete_connected_layer.Потому что, когда я пытался изменить Y в [-1,len(char_idx)]
и установить n_units
из fully_connected_layer
в len(char_idx)
, я не получил никакой ошибки, но результаты казались очень плохими даже с более чем 40 000 шагов обучения.
ТакМожете ли вы помочь мне понять, что я делаю неправильно?
Спасибо.