如何解决TensorFlow聊天bot的RuntimeError: Attempted to use a closed Session问题
解决TFLearn聊天Bot的RuntimeError: Attempted to use a closed Session错误
我使用Python和TensorFlow开发一款聊天Bot,该Bot读取JSON格式的意图列表文件,通过TFLearn训练神经网络模型,以此预测用户输入的意图并给出合适响应。运行时出现RuntimeError: Attempted to use a closed Session错误,相关代码及报错信息如下:
import nltk nltk.download('punkt') from nltk.stem.lancaster import LancasterStemmer stemmer = LancasterStemmer() from tensorflow.python.framework import ops import numpy import tensorflow as tf import tflearn import random import json import pickle from time import sleep with open("intents.json") as file: data = json.load(file) try: with open("data.pickle", "rb") as f: words, labels, training, output = pickle.load(f) except: words = [] labels = [] docs_x = [] docs_y = [] for intent in data ["intents"]: for pattern in intent["patterns"]: wrds = nltk.word_tokenize(pattern) words.extend(wrds) docs_x.append(wrds) docs_y.append(intent["tag"]) if intent["tag"] not in labels: labels.append(intent["tag"]) words = [stemmer.stem(w.lower()) for w in words if w != "?"] words = sorted(list(set(words))) labels = sorted(labels) training = [] output = [] out_empty = [0 for _ in range(len(labels))] for x, doc in enumerate(docs_x): bag = [] wrds = [stemmer.stem(w) for w in doc] for w in words: if w in wrds: bag.append(1) else: bag.append(0) output_row = out_empty[:] output_row[labels.index(docs_y[x])] = 1 training.append(bag) output.append(output_row) training = numpy.array(training) output = numpy.array(output) with open("data.pickle", "wb") as f: pickle.dump((words, labels, training, output), f) ops.reset_default_graph() net = tflearn.input_data(shape=[None, len(training[0])]) net = tflearn.fully_connected(net, 8) net = tflearn.fully_connected(net, 8) net = tflearn.fully_connected(net, len(output[0]), activation = "softmax") net = tflearn.regression(net) model = tflearn.DNN(net) try: model.load("model.tflearn") except: model.fit(training, output, n_epoch=1000, batch_size=8, show_metric=True) model.save("model.tflearn") def bag_of_words(s, words): bag = [0 for _ in range(len(words))] s_words = nltk.word_tokenize(s) s_words = [stemmer.stem(word.lower()) for word in s_words] for se in s_words: for i, w in enumerate(words): if w == se: bag[i] = 1 return numpy.array(bag) def chat(): print("Hi, How can i help you ?") while True: inp = input("You: ") if inp.lower() == "quit": break results = model.predict([bag_of_words(inp, words)])[0] results_index = numpy.argmax(results) tag = labels[results_index] if results[results_index] > 0.8: for tg in data["intents"]: if tg['tag'] == tag: responses = tg['responses'] sleep(3) Bot = random.choice(responses) print(Bot) else: print("I don't understand!") chat()
报错信息:
raise RuntimeError('Attempted to use a closed Session.') RuntimeError: Attempted to use a closed Session.
错误原因
该错误是因为TFLearn的DNN模型依赖的TensorFlow会话被意外关闭,调用model.predict()时无法访问活跃的会话上下文。通常发生在模型加载后,会话未被正确保留或初始化。
解决方法
修改模型加载代码块,在加载完成后显式初始化并保留会话:
try: model.load("model.tflearn") # 重新初始化会话,确保会话处于活跃状态 model.session = tf.Session() model.session.run(tf.global_variables_initializer()) except: model.fit(training, output, n_epoch=1000, batch_size=8, show_metric=True) model.save("model.tflearn")
如果上述方法无效,可在每次预测前检查会话状态,确保会话可用:
在chat()函数的预测代码前添加以下内容:
# 检查会话是否关闭,若关闭则重新初始化 if model.session is None or model.session._closed: model.session = tf.Session() model.session.run(tf.global_variables_initializer()) results = model.predict([bag_of_words(inp, words)])[0]
原理说明
TFLearn的DNN模型保存时仅存储模型参数,会话状态不会被持久化。加载模型后需要重新创建并初始化会话,确保模型预测时能访问到活跃的TensorFlow会话上下文。
内容的提问来源于stack exchange,提问作者Mohamed Ashour
相关产品推荐
相关产品推荐

