执行model.predict([text])时项目连续运行6次,关闭窗口才出预测结果求助
问题解决:执行
model.predict时程序重复运行、需关闭窗口才出结果 问题原因分析
从代码来看,核心问题有三点:
- 模型初始化代码
model = ClassificationModel(...)放在全局作用域,每次模块被加载时都会重复创建模型,触发多次初始化逻辑。 model.predict是阻塞式操作,在Tkinter主线程中执行会卡住界面,配合全局模型初始化的重复触发,造成程序连续运行多次的假象。- 预测时携带了
reprocess_input_data、overwrite_output_dir等训练专属参数,这类参数在预测阶段无意义,可能引发额外的重复处理流程。
修复步骤
- 模型仅初始化一次
将模型初始化移至main函数内部,添加判断逻辑确保只初始化一次,同时移除预测不需要的训练参数:
from simpletransformers.classification import ClassificationModel labels = ["Bilim Kurgu", "Ekonomi", "İslam", "Polisiye", "Romantik", "Sağlık", "Spor"] model = None # 全局声明模型变量 def main(metin): global model if not model: # 仅首次调用时初始化模型 model = ClassificationModel( 'bert', 'bert_model', num_labels=7, use_cuda=False, args={ "fp16": False, "output_dir": "bert_model" } ) print("tes12") tahmin = model.predict([metin]) print(labels[tahmin[0][0]]) return labels[tahmin[0][0]]
- 用线程处理预测,避免阻塞Tkinter界面
在主文件的classification函数中,通过线程执行预测操作,防止界面假死导致的重复触发:
import tkinter as tk import threading print("test1") def classification(): print("test2") raw_text = str(entry.get("1.0", tk.END)).strip() # 去除输入文本的多余换行 # 线程内执行预测,不阻塞主线程 def run_prediction(): tahmin_sonucu = main(raw_text) # 更新UI必须回到Tkinter主线程 categories_label.config(text="Kategoriler: " + tahmin_sonucu) threading.Thread(target=run_prediction).start()
- 检查按钮绑定逻辑
确保Tkinter按钮的command参数绑定的是函数对象而非函数调用(即写command=classification,不要加括号()),避免程序启动时自动多次执行函数。
内容的提问来源于stack exchange,提问作者MecitŞebib
相关产品推荐
相关产品推荐

