You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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无法正确匹配模型输入占位符与输入数据,主要触发场景:

  1. 依赖库导入顺序错误(TFLearn依赖TensorFlow,导入顺序颠倒会导致输入占位符注册失败)
  2. 代码缺失必要的依赖库导入语句,引发隐性机制故障
  3. 文件路径的转义字符问题可能导致数据加载异常,间接干扰模型训练流程

具体修复步骤

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:07:13