深度学习(YOLO、DETR) 十折交叉验证

二:交叉验证

在 K 折验证之前最常用的验证方法就是交叉验证,即把数据划分为训练集、验证集和测试集。一般的划分比例为 7:1:2。但如何合理的抽取样本就成为了使用交叉验证的难点,不同的抽取方法会导致截然不同的训练性能。同时由于验证机和训练集是不参与训练的,导致大量的数据无法应用于学习,所以显而易见的会导致训练的效果下降。

二:K 折交叉验证

将训练集数据划分为 K 部分,利用其中的 K-1 份做为训练,剩余的一份作为测试,最后取平均测试误差做为泛化误差。这样做的好处是,训练集的所有样本都必然会成为训练数据同时页必然有机会成为一次测试集。可以更好的利用训练集数据。

K 越大,平均误差被视为泛化误差这个结果就越可靠,但相应的所花费的时间也是线性增长的。

上图 中 划分测试、训练、验证的时候 平均分成10份 7份训练 1份验证 2份测试 。

按照顺序循环成一个圈 代码如下:

python 复制代码
import os
import shutil
import numpy as np

#文件地址
postfix = 'jpg'
imgpath = 'D:\\dataset\\images'
txtpath = 'D:\\dataset\\txt'


# 创建存储交叉验证结果的基础目录
os.makedirs('cross_validation', exist_ok=True)

# 获取文件列表并按文件名排序
listdir = np.array(sorted([i for i in os.listdir(txtpath) if i.endswith('.txt')], key=lambda x: int(x[:-4])))

# 将文件列表等分为10份
folds = np.array_split(listdir, 10)

# 进行10次交叉验证
for fold in range(10):
    # 初始化训练、验证、测试集索引
    train_indices = []
    val_indices = []
    test_indices = []

    # 训练集索引
    for i in range(7):
        index = (fold + i) % 10
        train_indices.extend(folds[index])

    # 验证集索引
    val_index = (fold + 7) % 10
    val_indices.extend(folds[val_index])

    # 测试集索引
    test_indices.extend(folds[(fold + 8) % 10])
    test_indices.extend(folds[(fold + 9) % 10])

    # 打印每次折的训练集、验证集和测试集的大小
    print(f'Fold {fold + 1}:')
    print(f'  Train set size: {len(train_indices)}')
    print(f'  Validation set size: {len(val_indices)}')
    print(f'  Test set size: {len(test_indices)}')

    # 为当前折创建目录
    fold_dir = f'cross_validation/fold_{fold + 1}'
    os.makedirs(f'{fold_dir}/images/train', exist_ok=True)
    os.makedirs(f'{fold_dir}/images/val', exist_ok=True)
    os.makedirs(f'{fold_dir}/images/test', exist_ok=True)
    os.makedirs(f'{fold_dir}/labels/train', exist_ok=True)
    os.makedirs(f'{fold_dir}/labels/val', exist_ok=True)
    os.makedirs(f'{fold_dir}/labels/test', exist_ok=True)

    # 将文件复制到当前折的训练、验证和测试目录中
    for i in train_indices:
        img_file = f'{imgpath}/{i[:-4]}.jpg'
        lbl_file = f'{txtpath}/{i}'
        shutil.copy(img_file, f'{fold_dir}/images/train/{i[:-4]}.jpg')
        shutil.copy(lbl_file, f'{fold_dir}/labels/train/{i}')

    for i in val_indices:
        img_file = f'{imgpath}/{i[:-4]}.jpg'
        lbl_file = f'{txtpath}/{i}'
        shutil.copy(img_file, f'{fold_dir}/images/val/{i[:-4]}.jpg')
        shutil.copy(lbl_file, f'{fold_dir}/labels/val/{i}')

    for i in test_indices:
        img_file = f'{imgpath}/{i[:-4]}.jpg'
        lbl_file = f'{txtpath}/{i}'
        shutil.copy(img_file, f'{fold_dir}/images/test/{i[:-4]}.jpg')
        shutil.copy(lbl_file, f'{fold_dir}/labels/test/{i}')

images和txt文件夹下存放文件,没有任何子文件夹

相关推荐
睿创咨询7 分钟前
科技与商业动态简报
人工智能·科技·ipd·商业
科技在线7 分钟前
科技赋能建筑新未来:中建海龙模块化建筑产品入选中国建筑首批产业化推广产品
大数据·人工智能
HED17 分钟前
用扣子快速手撸人生中第一个AI智能应用!
前端·人工智能
极小狐19 分钟前
极狐GitLab 如何 cherry-pick 变更?
人工智能·git·机器学习·gitlab
小宋加油啊20 分钟前
深度学习小记(包括pytorch 还有一些神经网络架构)
pytorch·深度学习·神经网络
沛沛老爹23 分钟前
从线性到非线性:简单聊聊神经网络的常见三大激活函数
人工智能·深度学习·神经网络·激活函数·relu·sigmoid·tanh
0x21132 分钟前
[论文阅读]ReAct: Synergizing Reasoning and Acting in Language Models
人工智能·语言模型·自然语言处理
何大春42 分钟前
【视频时刻检索】Text-Video Retrieval via Multi-Modal Hypergraph Networks 论文阅读
论文阅读·深度学习·神经网络·计算机视觉·视觉检测·论文笔记
mucheni44 分钟前
迅为iTOP-RK3576开发板/核心板6TOPS超强算力NPU适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品
arm开发·人工智能·边缘计算
Jamence1 小时前
多模态大语言模型arxiv论文略读(三十六)
人工智能·语言模型·自然语言处理