我正在尝试用土耳其语实现基于字符的聊天机器人。我在此link上使用TFLearn的文本生成示例。
由于要创建聊天机器人,因此我编辑了string_to_semi_redundant_sequences
函数。最初,此模型为一个字符序列生成单个字符,因此X保留每个输入语句的char-char序列的一个热向量,而Y保持与这些序列相对应的单个char的一个热向量。我将功能更改为:
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保留了一个以上的单热编码字符。它保留相应输入的目标(句子)(可以认为是“问题-响应”)。我认为模型将产生“ seq_maxlen”字符以构成一个句子,从而将Y重塑为[batch_size, seq_maxlen*len_chars]
。这是我的模型的详细信息:
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)
我的char字典的长度为94。由于我希望模型产生50(最大)个char,因此我在maxlen*len(char_idx)
中设置了fully_connected_layer
的单位数。
我训练了该模型约2000步,只需确保一切都OK。我想看到一些结果。但是当我尝试使用以下方法生成响应时:
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)的尺寸以及fully_connected_layer的尺寸有关。因为当我尝试将Y整形为[-1,len(char_idx)]
并将n_units
的{{1}}设置为fully_connected_layer
时,我没有出现错误,但是即使经过40.000多个训练步骤,结果仍然非常糟糕
那么您能帮我看看我做错了什么吗?
谢谢。