训练集和测试集的划分

目标:
得到将样本按比例划分维训练集和测试集。

    dsets["source"] = ImageList(open(data_config["source"]["list_path"]).readlines(), \
                                transform=prep_dict["source"])
    n_train = len(dsets["source"])
    split = n_train // 3
    indices = np.random.choice(range(n_train), size=n_train, replace=False)
    indices_save = np.array(indices)
    #保存随机数
    np.save('indices.npy', indices_save)  # 保存为.npy格式
    # # 读取
    # indices_save = np.load('indices_save.npy')
    # indices = indices_save.tolist()
    train_sampler = torch.utils.data.sampler.SubsetRandomSampler(indices[split:])
    valid_sampler = torch.utils.data.sampler.SubsetRandomSampler(indices[:split])
    train_loader  = DataLoader(dsets["source"], batch_size=train_bs,sampler=train_sampler,\
            shuffle=False, num_workers=4, drop_last=True)
    dset_loaders["test_s"]= DataLoader(dsets["source"], batch_size=train_bs,sampler=valid_sampler,\
            shuffle=False, num_workers=4, drop_last=True)

输入数据PipeLine
pytorch 的数据加载到模型的操作顺序是这样的:

① 创建一个 Dataset 对象
② 创建一个 DataLoader 对象
③ 循环这个 DataLoader 对象,将img, label加载到模型中进行训练

Dataset

Dataset 是 PyTorch 中用来表示数据集的一个抽象类,我们的数据集可以用这个类来表示,至少覆写下面两个方法即可。在返回数据前可以进行适当的数据处理,比如将原文用一串数字序列表示。

  • len:数据集大小
  • getitem:实现这个方法后,可以通过下标的方式( dataset[i] )的来取得第 ii 个数据

Dataloader

Dataloader 就是一个迭代器,最基本的使用就是传入一个 Dataset 对象,它就会根据参数 batch_size 的值生成一个 batch 的数据。

Sampler

PyTorch 提供了 Sampler 模块,用来对数据进行采样,可以在 DataLoader 的通过 sampler 参数调用

一般我们的加载训练集的 dataloader ,shuffle参数都会设置为True ,这时候使用了一个默认的采样器——RandomSampler

当 shuffle 设置为 False 时,默认使用的是 SequencetialSampler,其实就是按顺序取出数据集中的元素

在 PyTorch 中默认实现了以下 Sampler,如果我们要使用别的 Sampler, shuffle 要设置为 False

SequentialSampler
RandomSampler
WeightedSampler
SubsetRandomSampler

  • SubsetRandomSampler 常用来将数据集划分为训练集和测试集,比如这里就训练集和测试集按7:3 进行分割
n_train = len(sentiment_train_set)
split = n_train // 3
indices = list(range(n_train))
train_sampler = torch.utils.data.sampler.SubsetRandomSampler(indices[split:])
valid_sampler = torch.utils.data.sampler.SubsetRandomSampler(indices[:split])
train_loader = DataLoader(sentiment_train_set, sampler=train_sampler, shuffle=False)
valid_loader = DataLoader(sentiment_train_set, sampler=valid_sampler, shuffle=False)

但是这个indices的选择方法会导致训练集和测试集的类别不重合。
所以还采用了np.random.choice获得打乱的index。

random.choice

sample_size = len(train_dataset)
sampler1 = torch.utils.data.sampler.SubsetRandomSampler(
    np.random.choice(range(len(train_dataset)), sample_size))
#numpy.random.choice(a, size=None, replace=True, p=None)
#从a(只要是ndarray都可以,但必须是一维的)中随机抽取数字,并组成指定大小(size)的数组
#replace:True表示可以取相同数字,False表示不可以取相同数字
#数组p:与数组a相对应,表示取数组a中每个元素的概率,默认为选取每个元素的概率相同。

参考列表:
1、Dataset和Dataload,代码主体
2、一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
3、随机采样
4、分层抽样
5、源码解读

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值