本想在网上找个代码,看到大部分写的代码有点乱,有些直接自己把交叉验证代码撸了出来,也不知道对不对,我不敢用。然后我还是自己结合sklearn库的交叉验证接口来应用到torch中进行交叉验证。
关于各种交叉验证方式介绍可看这里:Sklearn中不同的数据抽样验证方式
⭐下面以10折交叉验证为例,结合sklearn库。给出一个在pytorch中进行10折交叉验证的模板:
def train_(): pass def eval_(): pass import collections history = collections.defaultdict(list) # 记录每一折的各种指标 from sklearn.model_selection import KFold, StratifiedShuffleSplit, StratifiedKFold skf = KFold(n_splits=10,shuffle=True,random_state=42) #skf = StratifiedShuffleSplit(n_splits=10,test_size=0.1,random_state=42) #skf = StratifiedKFold(n_splits=10, shuffle=True, random_state=42) for fold, (train_idx, val_idx) in enumerate(skf.split(x,y])): print('**'*10,'第', fold+1, '折','ing....', '**'*10) # for循环得到每一折的训练索引和验证索引,就可以对数据集进行抽取了。 # 抽取完之后,我们得到了训练数据和验证数据,那就分别转成torch的Dataset形式 # 然后再分别加载进torch的Dataloader里即可。 # 假设我们已经得到了训练数据的loader和验证数据的loader train_data_loader = ~ val_data_loader = ~ # 记住:每一折都要实例化新的模型,不然模型会学到测试集的东西 model = Model() for epoch in range(Epoch): print('——'*10, f'Epoch {epoch + 1}/{EPOCHS}', '——'*10) train_(model, train_data_loader,...) metrics1, metrics2, ... = eval_(model, val_data_loader,...) history['metrics1'].append(metrics1) history['metrics2'].append(metrics2) . . . 剩下就是按你自己的逻辑写即可。 # 最后对每一折的结果取平均即可作为10折交叉验证的结果。 m1 = np.mean(history['metrics1']) m2 = np.mean(history['metrics2'])
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)