如何逐行读取文本作为GPT-2 generate方法输入并保存输出?
解决方案
以下是修正后的代码,可解决逐行处理输入并生成对应文本的问题:
# 使用上下文管理器同时处理输入输出文件,更安全简洁 with open('/content/drive/My Drive/input_data.txt', 'r', encoding='utf-8') as input_file, \ open('/content/drive/My Drive/output_data.txt', 'w', encoding='utf-8') as output_file: for line in input_file: # 去除行首尾空白字符(含换行符),跳过空行避免无效生成 line_clean = line.strip() if not line_clean: continue # 编码输入文本 ids = tokenizer.encode(line_clean, add_special_tokens=True, return_tensors='pt') # 确保输入tensor与模型在同一设备(GPU/CPU) if next(model.parameters()).is_cuda: ids = ids.cuda() # 生成文本,调整max_new_tokens控制新增内容长度 final_outputs = model.generate( ids, do_sample=True, max_new_tokens=50, # 设置你需要的新增token数量,比如50 pad_token_id=model.config.eos_token_id, top_k=50, top_p=0.95, num_return_sequences=1 ) # 解码结果并写入,添加换行符分隔每行输出 generated_text = tokenizer.decode(final_outputs[0], skip_special_tokens=True) output_file.write(generated_text + '\n')
关键修改说明:
- 双层上下文管理器:避免手动关闭文件时的潜在错误,同时简化代码结构。
- 行内容清理:通过
strip()去除多余空白,跳过空行,防止无效输入导致的异常或无意义生成。 - 设备对齐:确保输入tensor和模型运行在同一设备(GPU/CPU),避免隐性设备不匹配问题(可能是循环中断的诱因之一)。
- 生成长度调整:原代码
max_new_tokens=ids.shape[1]+1仅新增1个token,生成内容几乎和原输入一致;改为固定数值可控制实际生成的新增内容长度。 - 输出格式规范:写入时添加
\n,保证每行生成结果单独成行,避免内容堆叠。
额外排查建议:
- 检查
input_data.txt的编码格式,确保为UTF-8,避免读取时乱码或截断。 - 若怀疑循环未遍历所有行,可在循环内添加
print(line_clean)调试,确认输入文件是否存在特殊格式(如仅一行、含不可见字符)。 - 若文件过大,直接迭代文件对象比
readlines()更高效,后者会将所有行加载到内存,可能引发性能问题。
内容的提问来源于stack exchange,提问作者Alaeddine
相关产品推荐
相关产品推荐

