您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Pytorch使用shuffle打乱数据的操作

51自学网 2021-10-30 22:39:37
  python
这篇教程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

补充:python对训练数据集shuffle(打乱)的一些方式

1.通过数组来shuffle

image_list=[]           # list of imageslabel_list=[]           # list of labels temp = np.array([image_list, label_list])temp = temp.transpose()np.random.shuffle(temp) images = temp[:, 0]     # array of images   (N,)labels = temp[:, 1]

2.通过索引 Index 来 shuffle

image_list=[]           # list of imageslabel_list=[]           # list of labels ##如果image_list存的是读取的特征数据,而不是图片路径,不要注释后面两句(list无法索引内部list)#[list indices must be integers or slices, not list]#image_list = np.array(image_list)#label_list = np.array(label_list) index = [i for i in range(len(image_list))]np.random.shuffle(index)images = image_list[index]labels = label_list[index]

以上为个人经验,希望能给大家一个参考,也希望大家多多支持51zixue.net。


教你利用Selenium+python自动化来解决pip使用异常
教你怎么用python爬取爱奇艺热门电影
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。