Pytorch使用shuffle打乱数据

这个东西算是我被这个shuffle坑了的一个总结吧!
首先我得告诉你一件事,那就是pytorch中的tensor,如果直接使用random.shuffle打乱数据,或者使用下面的方式,自己定义直接写。

 def Shuffle(self, x, y,random=None, int=int):
         if random is None:
            random = self.random
                 for i in range(len(x)):
            j = int(random() * (i + 1))
            if j<=len(x)-1:
                x[i],x[j]=x[j],x[i]
                y[i],y[j]=y[j],y[i]
          retrun x,y

那你就会收获一堆的混乱数据,因为使用这种交换的方式对tensor类型的数据进行操作,会导致里面的数据出现重复复制的问题。
比如我y中的数据为【0,1,0,1,0,1】
在经过几次shuffle,其中的数据就变成了【1,1,1,1,1,1】。
数据顿时出现混乱。
正确的方式是先转成numpy,再进行交换数据。
比如:

 def Shuffle(self, x, y,random=None, int=int):
        """x, random=random.random -> shuffle list x in place; return None.

        Optional arg random is a 0-argument function returning a random
        float in [0.0, 1.0); by default, the standard random.random.
        """

        if random is None:
            random = self.random #random=random.random
        #转成numpy
        if torch.is_tensor(x)==True:
            if self.use_cuda==True:
               x=x.cpu().numpy()
            else:
               x=x.numpy()
        if torch.is_tensor(y) == True:
            if self.use_cuda==True:
               y=y.cpu().numpy()
            else:
               y=y.numpy()
        #开始随机置换
        for i in range(len(x)):
            j = int(random() * (i + 1))
            if j<=len(x)-1:#交换
                x[i],x[j]=x[j],x[i]
                y[i],y[j]=y[j],y[i]

        #转回tensor
        if self.use_cuda == True:
            x=torch.from_numpy(x).cuda()
            y=torch.from_numpy(y).cuda()

        else:
            x = torch.from_numpy(x)
            y = torch.from_numpy(y)
        return x,y
  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 在PyTorch打乱数据集可以使用torch.utils.data.DataLoader中的shuffle参数。将shuffle参数设置为True即可在每个epoch开始时随机打乱数据集。例如: ``` from torch.utils.data import DataLoader train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True) ``` 这样在每个epoch开始时,train_loader会自动将数据打乱,以确保模型训练的随机性。 ### 回答2: 在深度学习中,数据集的顺序往往是很重要的,因为样本之间可能存在一定的相关性,如果按照固定的顺序进行训练,可能会影响模型的泛化能力。因此,在训练时需要对数据集进行随机化处理,也就是使其每次迭代获取的数据都是随机的。pytorch提供了一个shuffle函数来实现数据集的随机化处理。 在pytorch中,我们可以通过调用Dataset类的shuffle方法来实现数据的随机打乱。具体实现步骤如下: 1. 在定义数据集时,实现自己的get_item方法和len方法,get_item方法返回每个样本的数据和标签,len方法返回数据集的大小。 2. 构建DataLoader,通过设置参数shuffle=True来实现数据集的随机打乱。可以通过batch_size来设置每个批次中的数据量,num_workers来设置数据加载的并行度,pin_memory来设置是否使用固定大小的内存。 3. 迭代DataLoader,逐个获取样本的数据和标签,进行训练。 需要注意的是,每个epoch需要重新进行数据集的随机化处理,否则每次获取的数据仍然是固定的,不会对模型的训练产生任何影响。在实际的训练过程中,往往需要根据实际情况来设置batch_size和num_workers的大小,并进行多次的epochs训练。 总之,在进行深度学习训练时,数据集的随机化是非常重要的一步。通过pytorch提供的shuffle方法,可以很方便地实现数据集的随机化处理,从而有效地提高模型的泛化能力。 ### 回答3: 在深度学习训练过程中,数据的顺序会影响训练结果,因为有些模型会倾向于记忆先出现的数据。因此,我们需要将数据集中的样本打乱(shuffle),以避免训练出的模型是有偏的。 在 PyTorch 中,可以通过使用 `torch.utils.data.DataLoader` 来加载数据集,并通过设置参数 `shuffle=True` 来自动打乱数据集顺序。 `DataLoader` 是一个用于迭代数据的工具,它可以将数据集分成多个 batch,并对每个 batch 打乱样本顺序。下面是一些具体的示例代码: ```python from torchvision import datasets, transforms from torch.utils.data import DataLoader # 定义数据的变换 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) # 加载 MNIST 数据集,并打乱顺序 train_dataset = datasets.MNIST('data', train=True, download=True, transform=transform) train_loader = DataLoader(train_dataset, shuffle=True, batch_size=64) # 迭代数据集 for data, target in train_loader: pass ``` 在上面的代码中,我们首先定义了一个 `transform` 变换,它将数据转换为张量,并正则化数据。然后,我们加载了 MNIST 数据集,并将 `shuffle` 参数设置为 `True`,以打乱数据集的顺序。最后,我们使用 `DataLoader` 来迭代数据集。 除了 `shuffle` 参数之外,还可以使用 `torch.utils.data.RandomSampler` 和 `torch.utils.data.SequentialSampler` 来手动控制数据集的顺序。 `RandomSampler` 会随机打乱样本顺序,而 `SequentialSampler` 将样本按照原来的顺序排列。需要注意的是,如果手动设置了样本顺序,那么就不需要再将 `shuffle` 参数设置为 `True`。 综上所述,对于 PyTorch 来说,打乱数据集顺序非常简单,并且可以通过 `DataLoader` 的 `shuffle` 参数来实现。这可以帮助我们避免训练出有偏的模型,提高模型的泛化能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值