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

Python按24:6拆分训练测试集时列表长度异常膨胀问题

数据集拆分数据量异常膨胀问题修正

问题描述

需要将单列表元素拆分追加到训练、测试两组共四个列表中,预期逻辑为:按遍历顺序每30个元素为一组,前24个元素及对应标签追加到train_imgs、train_lbs,后续6个元素及对应标签追加到test_imgs、test_lbs,循环完成全量数据拆分。
实际运行后训练集与测试集总长度达到9000,远大于初始array_resized的300条原始数据长度。

相关原始代码

拆分逻辑代码

train_imgs = []
train_lbs = []
test_imgs = []
test_lbs = []

i = 0
j = 0
print(len(array_resized))
for i in range(len(array_resized)):
  for j in range(24):
    train_imgs.append(array_resized[i])
    train_lbs.append(ar_label[i])
    j = j+1
  j = 0
  for j in range(6):
    test_imgs.append(array_resized[i])
    test_lbs.append(ar_label[i])
    j = j+1
  j = 0

数据集预处理代码

array_0 = [cv2.imread(file, cv2.IMREAD_GRAYSCALE) for file in glob.glob("/content/imgs_3/0*")]
ar_label0 = ['0' for file in array_0]
array_1 = [cv2.imread(file, cv2.IMREAD_GRAYSCALE) for file in glob.glob("/content/imgs_3/1*")]
ar_label1 = ['1' for file in array_1]

# 按相同规则生成array_2到array_9、ar_label2到ar_label9

array_all = array_0+array_1+array_2+array_3+array_4+array_5+array_6+array_7+array_8+array_9

array_resized = [cv2.resize(file, (28,28), interpolation=cv2.INTER_LINEAR) for file in array_all]

问题原因

  • 核心逻辑错误:外层循环遍历全部300条数据时,对每一条数据都在内层循环24次追加到训练集、循环6次追加到测试集,单条数据被重复追加30次,总数据量为300*(24+6)=9000,和异常表现完全匹配。
  • 冗余无效代码:for j in range(x)语法会自动迭代j值,循环内手动写j = j+1、循环末尾重置j=0没有任何实际作用,属于多余代码。
  • 逻辑偏差:没有按30的步长做分块处理,完全违背了“每30个元素为一组拆分”的需求。
  • 预处理疏漏:现有预处理代码仅拼接了图像数组array_all,未按相同顺序拼接ar_label0到ar_label9生成总标签列表ar_label,直接运行会报变量未定义错误。

修正后代码

train_imgs = []
train_lbs = []
test_imgs = []
test_lbs = []

# 先补全标签列表拼接,顺序和array_all完全一致
ar_label = ar_label0 + ar_label1 + ar_label2 + ar_label3 + ar_label4 + ar_label5 + ar_label6 + ar_label7 + ar_label8 + ar_label9

# 按步长30遍历,每次取连续30个元素为一个拆分块
for block_start in range(0, len(array_resized), 30):
    # 当前块前24个加入训练集
    for idx in range(block_start, block_start + 24):
        if idx >= len(array_resized): # 兼容最后一组不足30个的边界情况
            break
        train_imgs.append(array_resized[idx])
        train_lbs.append(ar_label[idx])
    # 当前块剩余6个加入测试集
    for idx in range(block_start + 24, block_start + 30):
        if idx >= len(array_resized):
            break
        test_imgs.append(array_resized[idx])
        test_lbs.append(ar_label[idx])

# 拆分结果校验
print(f"训练集长度:{len(train_imgs)}, 测试集长度:{len(test_imgs)}, 总数据量:{len(train_imgs)+len(test_imgs)}")

拆分结果说明:300条原始数据按规则拆分后,训练集共240条、测试集共60条,总长度和原始数据量完全一致,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:57:14