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

2020-12-23  本文已影响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)

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

上一篇下一篇

猜你喜欢

热点阅读