在用深度学习做分类的时候,常常需要进行交叉验证,目前pytorch没有通用的一套代码来实现这个功能。可以借助 sklearn中的 StratifiedKFold,KFold来实现,其中StratifiedKFold可以根据类别的样本量,进行数据划分。以5折为例,它可以实现每个类别的样本都是4:1划分。
代码简单的示例如下:
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5)
for i, (train_idx, val_idx) in enumerate(skf.split(imgs, labels)):
trainset, valset = np.array(imgs)[[train_idx]],np.array(imgs)[[val_idx]]
traintag, valtag = np.array(labels)[[train_idx]],np.array(labels)[[val_idx]]
以上示例是将所有imgs列表与对应的labels列表进行split,得到train_idx代表训练集的下标,val_idx代表验证集的下标。后续代码只需要将split完成的trainset与valset输入dataset即可。
接下来用我自己数据集的实例来完整地实现整个过程,即从读取数据,到开始训练。如果你的数据集存储方式和我不同,改一下数据读取代码即可。关键是如何获取到imgs和对应的labels。
我的数据存储方式是这样的(类别为文件夹名,属于该类别的图像在该文件夹下):
"""A generic data loader where the