基于TFLearn的模型训练报IndexError: list index out of range问题排查
问题
尝试构建基于TFLearn的模型,调用model.fit()训练时触发IndexError: list index out of range错误。已尝试降低batch size和epochs,也检查过输入输出层维度(训练集共26个样本,每个样本为长度46的numpy数组;输出集共26个样本,每个为长度6的numpy数组),但问题仍未解决。
错误信息
IndexError Traceback (most recent call last) Cell In[43], line 1 ----> 1 model.fit(training, output ,n_epoch=10,batch_size=8,show_metric=True) 2 model.save('chatbot.tflearn') File d:\Desktop AI\env\Lib\site-packages\tflearn\models\dnn.py:183, in DNN.fit(self, X_inputs, Y_targets, n_epoch, validation_set, show_metric, batch_size, shuffle, snapshot_epoch, snapshot_step, excl_trainops, validation_batch_size, run_id, callbacks) 178 valY = validation_set[1] 180 # For simplicity we build sync dict synchronously but Trainer support 181 # asynchronous feed dict allocation. 182 # TODO: check memory impact for large data and multiple optimizers --> 183 feed_dict = feed_dict_builder(X_inputs, Y_targets, self.inputs, 184 self.targets) 185 feed_dicts = [feed_dict for i in self.train_ops] 186 val_feed_dicts = None File d:\Desktop AI\env\Lib\site-packages\tflearn\utils.py:300, in feed_dict_builder(X, Y, net_inputs, net_targets) 298 X = [X] 299 for i, x in enumerate(X): --> 300 feed_dict[net_inputs[i]] = x 301 else: 302 # If a dict is provided 303 for key, val in X.items(): 304 # Copy to feed_dict if dict already fits {placeholder: data} template IndexError: list index out of range
完整代码
stemmer = LancasterStemmer() with open('D:\Desktop AI\Wednesday\chat\intents.json') as file : data = json.load(file) words =[] labels = [] docs_x = [] docs_y = [] for intent in data['intents']: for pattern in intent['patterns']: wrd = nltk.word_tokenize(pattern) words.extend(wrd) docs_x.append(wrd) 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 not in "?"] words = sorted(list(set(words))) labels = sorted(labels) training=[] output=[] out_empty = [0 for _ in range(len(labels))] # creating a bag of words using one hot encoding 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=np.array(training) output=np.array(output) # neural layer 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) model.fit(training, output ,n_epoch=10,batch_size=8,show_metric=True) model.save('chatbot.tflearn')
问题原因与解决方案
核心原因
该错误本质是TFLearn的feed_dict_builder无法正确匹配模型输入占位符与输入数据,主要触发场景:
- 依赖库导入顺序错误(TFLearn依赖TensorFlow,导入顺序颠倒会导致输入占位符注册失败)
- 代码缺失必要的依赖库导入语句,引发隐性机制故障
- 文件路径的转义字符问题可能导致数据加载异常,间接干扰模型训练流程
具体修复步骤
1. 修正依赖库导入顺序与完整性
TFLearn必须在TensorFlow之后导入,同时补全所有缺失的导入语句,代码最顶部添加:
import tensorflow as tf import tflearn import nltk from nltk.stem.lancaster import LancasterStemmer import json import numpy as np
2. 重置TensorFlow默认图
在定义模型前添加重置图的代码,避免之前的残留计算图干扰:
# 重置TensorFlow默认图 tf.reset_default_graph()
放置在神经网络层定义代码的上方。
3. 修正文件路径的转义问题
原路径中的反斜杠会被解析为转义字符,导致文件读取失败,改为以下两种方式之一:
- 使用双反斜杠:
'D:\\Desktop AI\\Wednesday\\chat\\intents.json' - 使用原始字符串:
r'D:\Desktop AI\Wednesday\chat\intents.json'
4. 验证输入数据维度(可选但推荐)
在模型定义前打印数据维度,确认与输入层匹配:
print("Training data shape:", training.shape) # 应输出(26,46) print("Output data shape:", output.shape) # 应输出(26,6)
修复后的完整代码
import tensorflow as tf import tflearn import nltk from nltk.stem.lancaster import LancasterStemmer import json import numpy as np stemmer = LancasterStemmer() # 修正文件路径 with open(r'D:\Desktop AI\Wednesday\chat\intents.json') as file : data = json.load(file) words =[] labels = [] docs_x = [] docs_y = [] for intent in data['intents']: for pattern in intent['patterns']: wrd = nltk.word_tokenize(pattern) words.extend(wrd) docs_x.append(wrd) 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 not in "?"] words = sorted(list(set(words))) labels = sorted(labels) training=[] output=[] out_empty = [0 for _ in range(len(labels))] # creating a bag of words using one hot encoding 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=np.array(training) output=np.array(output) # 打印维度确认 print("Training data shape:", training.shape) print("Output data shape:", output.shape) # 重置TensorFlow图 tf.reset_default_graph() # neural layer 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) model.fit(training, output ,n_epoch=10,batch_size=8,show_metric=True) model.save('chatbot.tflearn')
内容的提问来源于stack exchange,提问作者Om Ghosal
相关产品推荐
相关产品推荐

