如何修改LSTM文本生成代码 获取Top3预测结果实现多样化生成
LSTM文本生成Top3候选采样修改方案
核心修改逻辑是替换原有np.argmax固定取最高概率词的逻辑,改为从预测概率Top3的候选词中随机选择,即可实现相同输入生成多样化语句的效果。
关键修改点
- 移除原有固定取概率最大值的
np.argmax逻辑 - 对模型输出的概率分布排序,提取概率最高的3个词对应的索引
- 支持按候选词的原始概率做加权随机抽样,比等概率随机选的生成结果更自然
- 修复原代码中
ouput_word的拼写错误(原代码变量名漏写t,会触发运行报错)
修改后完整代码
import numpy as np def prediction(seed_text, next_words, top_k=3): for _ in range(next_words): token_list = tokenizer.texts_to_sequences([seed_text])[0] token_list = pad_sequences([token_list], maxlen=max_seq_length-1, padding='pre') # 拿到单样本的全词表预测概率 pred_probs = model.predict(token_list, verbose=0)[0] # 取概率最高的top3候选的索引 topn_indices = pred_probs.argsort()[-top_k:][::-1] # 提取这3个候选对应的概率,做归一化后加权随机选 topn_probs = pred_probs[topn_indices] topn_probs = topn_probs / topn_probs.sum() # 按概率加权随机抽1个候选索引 predicted = np.random.choice(topn_indices, p=topn_probs) output_word = "" for word, index in tokenizer.word_index.items(): if index == predicted: output_word = word break seed_text += ' ' + output_word return seed_text
代码说明
pred_probs.argsort()[-top_k:][::-1]:argsort会返回概率从小到大排序的索引,取最后3个就是概率最高的3个索引,最后反转是为了让索引按概率从高到低排列- 对Top3候选的概率做归一化后加权抽样,会让概率更高的候选被选中的概率更大,既保证生成内容的合理性,又能带来多样性;如果想要完全等概率选3个词,把
np.random.choice的p参数去掉即可 - 函数加了
top_k参数,后续想调整候选池大小(比如改成Top5)直接传参就行,不用改内部逻辑
如果想要生成结果的多样性更高,可以适当调大top_k值;如果想要内容更稳定,就把top_k调小。
内容的提问来源于stack exchange,提问作者FlubberBeer
相关产品推荐
相关产品推荐

