在pytorch中将数据打包为DataLoader后每个epoch中的打乱策略

在pytorch中将数据打包为DataLoader后每个epoch中的打乱策略

有两种打乱策略:

1、利用shuffle

在 PyTorch 中,当使用 DataLoader 并设置 shuffle=True 时,数据会在每个 epoch 开始时被重新打乱。这意味着在每个 epoch,数据加载的顺序都会不同,这有助于模型避免对特定的数据顺序产生过拟合。

python 复制代码
    train_loader = DataLoader(dataset=train_dataset, 
                              batch_size=batch_size, 
                              shuffle=True, 
                              num_workers=0)

在这种情况下,每次开始一个新的 epoch 并从 train_loader 中迭代数据时,train_loader 会自动将数据集中的数据打乱。这是一种常见的做法,用于确保模型接收到的数据顺序在每个 epoch 都是随机的,从而帮助模型更好地泛化。

如果 shuffle 参数被设置为 False,则数据加载的顺序在每个 epoch 中保持不变。这种情况通常用于那些需要保持数据顺序的场合,比如时间序列数据处理。

2、利用SubsetRandomSampler

在这种方法中,DataLoader 实例是通过使用 SubsetRandomSampler 创建的,这与直接在 DataLoader 中设置 shuffle=True 有所不同。当使用 SubsetRandomSampler 时,数据集的划分是固定的,但是在这个子集内的数据在每个 epoch 开始时会被重新打乱。

python 复制代码
    train_data = torch.FloatTensor(train_data)

    train_data = TensorDataset(train_data, train_data)

    num_train = len(train_data)
    indices = list(range(num_train))
    np.random.shuffle(indices)
    split = int(np.floor(num_train * valid_size))

    train_idx, valid_idx = indices[split:], indices[:split]

    train_sampler = SubsetRandomSampler(train_idx)
    valid_sampler = SubsetRandomSampler(valid_idx)

    train_loader = torch.utils.data.DataLoader(dataset=train_data,
                                               batch_size=batch_size,
                                               sampler=train_sampler,
                                               # shuffle = True,
                                               num_workers=0)

    valid_loader = torch.utils.data.DataLoader(dataset=train_data,
                                               batch_size=batch_size,
                                               sampler=valid_sampler,
                                               # shuffle = True,
                                               num_workers=0)

在这种情况下,train_loader 和 valid_loader 使用 SubsetRandomSampler,它在每个 epoch 开始时会在其所对应的索引子集(train_idx 或 valid_idx)内部重新打乱数据。因此,尽管整个数据集的划分(训练集和验证集的分割)是固定的,但在每个 epoch 中,数据加载的顺序在各自的子集内是随机的。

这种方法结合了固定的训练/验证划分和每个 epoch 的内部随机性,有助于模型的泛化,同时保持了对训练和验证数据集的稳定划分。

相关推荐
xingshanchang1 小时前
PyTorch 不支持旧GPU的异常状态与解决方案:CUDNN_STATUS_NOT_SUPPORTED_ARCH_MISMATCH
人工智能·pytorch·python
reddingtons2 小时前
Adobe Firefly AI驱动设计:实用技巧与创新思维路径
大数据·人工智能·adobe·illustrator·photoshop·premiere·indesign
CertiK2 小时前
IBW 2025: CertiK首席商务官出席,探讨AI与Web3融合带来的安全挑战
人工智能·安全·web3
Deepoch3 小时前
Deepoc 大模型在无人机行业应用效果的方法
人工智能·科技·ai·语言模型·无人机
Deepoch3 小时前
Deepoc 大模型:无人机行业的智能变革引擎
人工智能·科技·算法·ai·动态规划·无人机
kngines3 小时前
【字节跳动】数据挖掘面试题0003:有一个文件,每一行是一个数字,如何用 MapReduce 进行排序和求每个用户每个页面停留时间
人工智能·数据挖掘·mapreduce·面试题
Binary_ey3 小时前
AR衍射光波导设计遇瓶颈,OAS 光学软件来破局
人工智能·软件需求·光学软件·光波导
昵称是6硬币3 小时前
YOLOv11: AN OVERVIEW OF THE KEY ARCHITECTURAL ENHANCEMENTS目标检测论文精读(逐段解析)
图像处理·人工智能·深度学习·yolo·目标检测·计算机视觉
费弗里4 小时前
Python全栈应用开发利器Dash 3.x新版本介绍(1)
python·dash
平和男人杨争争4 小时前
机器学习2——贝叶斯理论下
人工智能·机器学习