python生成图像样本的训练集、验证集和测试集

       准备好图像样本和标注文件后,需对样本集进行划分,生成训练集、验证集和测试集,关于训练集划分参考:https://blog.youkuaiyun.com/kieven2008/article/details/81582591

      我的目录结构:

——data
   ——image
     ——0.jpg
     ——1.jpg
      .
      .
      .
   ——labels
     ——0.txt
     ——1.txt
      .
      .
      .

      将样本按 training : validation : testing = 8:1:1,实现在image同级目录下创建文件夹sample_set,将按比例生成的train.txt、val.txt、test.txt存放在sample_set中。

 

import math
import os
import random

root_path=os.getcwd()
labels_path=root_path+"/JPEGImages"

label_list=os.listdir(labels_path)


train_and_val_list=random.sample(label_list,int(math.floor(len(label_list)*9/10)))
train_and_val_list.sort()


train_list=random.sample(train_and_val_list,int(math.floor(len(train_and_val_list)*8/9)))
train_list.sort()

val_list=list(set(train_and_val_list).difference(set(train_list)))
val_list.sort()

test_list=list(set(label_list).difference(set(train_and_val_list)))
test_list.sort()

def create_set(input_list_name,input_txt_name,key):
    sample_set_path=root_path+"/"+"sample_set"
    if not os.path.exists(sample_set_path):
       os.mkdir(sample_set_path)
    txt_file=open(sample_set_path+"/"+key+".txt",'w+')
    for item in eval(input_list_name):
        txt_file.write(labels_path+'/'+item+'\n')
    txt_file.close()

key_name=['train','val','test']
for name in key_name:
    list_name=name+"_list"
    txt_name=name+".txt"
    create_set(list_name,txt_name,name)

  python编程笔记:

           random.sample(list,n): 从list中随机截取n个元素,以list形式返回,不改变原有list;

           math.floor(x):返回x的向下取整值;

           set():创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等;

           set().difference(set):求差集;

           eval():执行一个字符串表达式,并返回表达式的值.

<think>好的,我需要回答用户的问题:在处理图像数据集时,应该先划分训练集验证集测试集,还是先进行样本扩充? 首先,我需要回忆一下机器学习的常规流程。通常,数据预处理数据集划分是前期步骤。用户提到的两种操作,数据集划分样本扩充,顺序可能会影响模型的训练效果评估的准确性。 根据用户提供的引用内容,引用[1]提到将数据集划分为训练集验证集测试集。引用[2]讨论了数据分布一致性检验,以及如何调整训练集测试集样本分布。引用[3]则提到数据增强作为数据采集的一种方法。 用户的疑问在于顺序问题。正确的做法应该是在划分数据集之后再进行数据增强。这是因为验证集测试集需要保持原始数据的分布,以真实反映模型的泛化能力。如果在划分前就进行数据增强,可能会让增强后的数据泄漏到验证集测试集中,导致评估结果不准确。 例如,如果先进行数据增强再划分,那么验证集测试集中可能包含增强后的样本,这些样本可能带有训练集的特征,使模型在评估时表现过好,但实际上可能无法泛化到真实的新数据。相反,如果先划分,然后在训练集上进行增强,可以确保验证集测试集的数据是独立且未被增强处理的,从而更真实地评估模型性能。 此外,引用[2]中提到的方法,即检验训练集测试集的分布一致性,也需要保持验证集测试集的原始性。如果在增强后再划分,可能破坏这种分布一致性检验的有效性。 因此,正确的顺序应该是先划分数据集,再对训练集进行数据增强,而验证集测试集保持原样。这样可以确保模型在训练时利用增强数据提高泛化性,同时准确评估其在真实数据上的表现。</think>### 图像数据集处理的正确顺序 在图像数据处理流程中,**正确的顺序是:先划分训练集验证集测试集,再对训练集进行样本扩充**。以下是详细原因操作逻辑: --- #### **1. 核心原则:避免数据泄漏与保证评估真实性** - **数据泄漏风险**: 若先进行数据增强再划分数据集,增强后的样本可能同时存在于训练集验证集测试集中。例如,原始图像通过旋转生成样本可能被分配到不同子集,导致模型间接“见过”测试集的特征,评估结果虚假偏高[^1][^2]。 - **评估真实性**: 验证集测试集需严格保持原始数据分布,模拟真实场景中的未知数据。若增强数据混入验证/测试集,模型性能评估将失去参考价值[^1]。 --- #### **2. 标准操作流程** **步骤1:初始划分(原始数据 → 训练集验证集测试集)** - 使用分层抽样(如`train_test_split`)确保各类别分布均衡[^1]。 - 典型比例:训练集(70%)、验证集(15%)、测试集(15%),或根据数据量调整。 **步骤2:仅对训练集进行数据增强** - 增强方法:旋转、裁剪、颜色变换、添加噪声等。 - **关键限制**:验证集测试集必须保持原始状态,不得应用任何增强操作[^3]。 **示例代码**: ```python from sklearn.model_selection import train_test_split from tensorflow.keras.preprocessing.image import ImageDataGenerator # 初始划分(原始数据) X_train, X_temp, y_train, y_temp = train_test_split(images, labels, test_size=0.3, stratify=labels) X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, stratify=y_temp) # 仅对训练集增强 train_datagen = ImageDataGenerator(rotation_range=30, horizontal_flip=True) train_generator = train_datagen.flow(X_train, y_train, batch_size=32) # 验证集测试集使用原始数据 val_datagen = ImageDataGenerator() val_generator = val_datagen.flow(X_val, y_val, batch_size=32) ``` --- #### **3. 特殊场景的注意事项** - **数据极度匮乏时**: 若原始数据极少(如医疗影像),可先整体增强后再划分,但需严格保证增强后的样本不跨子集重复。例如,对每张原始图像生成固定数量的增强样本,再整体划分[^3]。 ```python # 整体增强后划分(仅限极端数据不足时) augmented_images = [...] # 对原始数据统一增强 augmented_labels = [...] X_train, X_test, y_train, y_test = train_test_split(augmented_images, augmented_labels, test_size=0.2) ``` - **分布一致性检验**: 若需检测训练集测试集分布差异(引用[2]),应基于原始未增强数据执行,避免增强操作干扰结果。 --- #### **4. 错误顺序的后果示例** 假设先增强后划分: 1. 原始图像$I_1$通过旋转生成$I_1'$、$I_1''$。 2. 若$I_1$进入训练集,$I_1'$进入测试集,模型可能通过记忆$I_1$的特征间接拟合$I_1'$,导致测试准确率虚高。 3. 最终模型在真实场景中泛化能力显著下降。 --- ### **总结** - **标准流程**:划分 → 增强(仅训练集)。 - **核心目标**:确保验证集测试集的独立性与原始性,避免数据泄漏。 - **例外情况**:数据极度匮乏时需谨慎处理,并明确记录增强策略。 --- ### 相关问题 1. 如何验证训练集测试集的数据分布是否一致? 2. 数据增强是否会影响模型的鲁棒性测试结果? 3. 在小样本场景下,如何平衡数据增强与过拟合风险?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值