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

Windows本地训练模型遇IndexError: list index out of range问题求助

问题原因

你的错误根源有两个:

  • 硬编码索引[3]:Linux和Windows的路径结构存在差异,导致路径拆分后的列表长度不一致,固定索引会直接引发越界。比如Linux下相对路径./data/train/class1拆分后是['.', 'data', 'train', 'class1'],索引3对应类名;但Windows下glob可能返回绝对路径(如E:\Project\data\train\class1),拆分后是['E:', 'Project', 'data', 'train', 'class1'],索引3是train而非类名,若路径结构不符合预期,还会直接出现列表长度不足3的情况,触发索引越界。
  • 依赖路径分隔符的拆分逻辑:即便用了os.path.sep,固定索引依然无法适配不同系统的路径层级。

解决方案

放弃固定索引提取类名,改用跨平台的路径处理方法直接获取文件夹名称,推荐两种实用方式:

方法1:用os.path.basename()(兼容所有Python版本)

修改data_utils.py中的labels_to_number函数:

import os
import glob

def labels_to_number(path):
    # 用os.path.join拼接路径,避免手动加分隔符的跨平台问题
    class_paths = glob.glob(os.path.join(path, '*'))
    # 提取每个路径的最后一级文件夹名,同时过滤非文件夹项
    classes = [os.path.basename(p) for p in class_paths if os.path.isdir(p)]
    classes.sort()

    labels_dict = {label: idx for idx, label in enumerate(classes)}
    return labels_dict

方法2:用pathlib(Python 3.4+ 更简洁)

from pathlib import Path

def labels_to_number(path):
    path_obj = Path(path)
    # 直接遍历路径下的子目录
    class_dirs = [d for d in path_obj.iterdir() if d.is_dir()]
    # 提取目录名并排序
    classes = sorted([d.name for d in class_dirs])
    
    labels_dict = {label: idx for idx, label in enumerate(classes)}
    return labels_dict

pathlib是Python 3官方推荐的面向对象路径处理方式,代码更简洁且天然适配跨平台场景。

额外注意事项

  • 确认./data/train/目录下确实存在类文件夹,无空目录或不符合预期的文件;
  • 主文件中的TRAIN_PATH可保持不变,但建议后续用os.path.join()或pathlib拼接路径,避免手动写分隔符引发的问题。

内容的提问来源于stack exchange,提问作者abrar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:20:28