美文网首页
深度学习的交叉验证以及代码实现

深度学习的交叉验证以及代码实现

作者: 升不上三段的大鱼 | 来源:发表于2020-12-23 03:46 被阅读0次

    在机器学习里通常会把数据集分成训练集,验证集和测试集,但是在数据比较少的时候,分成三组就不太够用了。一个解决的方法就是k折交叉验证。
    k折交叉验证把数据集分为k份,每个子集都会做一次验证集,剩余的子集做训练集,就会得到k个训练好的模型。这k个模型在验证集上的误差和平均之后就得到了交叉验证误差。


    k-fold

    理论上来说,按照把数据集分成k份然后一个for循环就好了。然鹅,在现实自己跑代码的时候,由于内(chao)存(piao)不足,用别人的GPU有时间限制等各种令人心酸的限制,必须对这个k-折好好规划一下。
    下面来看代码实现:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    from sklearn.cross_validation import train_test_split
    from sklearn.model_selection import KFold
    
    import torchvision
    from torchvision import datasets, models, transforms
    from torch.utils.data import Dataset, DataLoader
    

    对于一个数据集内图像的编号,利用sklearn库里的KFold函数来进行划分,然后存在一个csv文件里。

    def generate_index(ground_truth):
        Y = ground_truth['image']
        kf = KFold(n_splits=5, shuffle=True)
        n = len(Y)
        index = {'train_index':[],
                 'val_index':[]}
    
        for train_index, val_index in kf.split(np.zeros(n), Y):
            index['train_index'].append(train_index)
            index['val_index'].append(val_index)
    
        pd.DataFrame(index['train_index']).T.to_csv(file_name + '_trainindex_' + '.csv', index=False)
        pd.DataFrame(index['val_index']).T.to_csv(file_name + '_valindex_' + '.csv', index=False)
    

    然后加载其中的一折的index,然后进行训练。这里的dataloader按照index读取数据:

    train_index = np.array(pd.read_csv(output_directory + '/isic_trainindex.csv').iloc[1:-1,ith].astype(int))
     
    val_index = np.array(pd.read_csv(output_directory+ '/isic_valindex.csv').iloc[1:-1,ith]).astype(int)
    
    train_loader = kfold_load_isic(training_data, batch_size, resolution)
    val_loader = kfold_load_isic(validation_data, batch_size, resolution)
    

    然后按照正常训练的流程训练就好了,最后把每个折在测试集上的结果做平均。

    相关文章

      网友评论

          本文标题:深度学习的交叉验证以及代码实现

          本文链接:https://www.haomeiwen.com/subject/tdaenktx.html