這個(gè)東西算是我被這個(gè)shuffle坑了的一個(gè)總結(jié)吧!
首先我得告訴你一件事,那就是pytorch中的tensor,如果直接使用random.shuffle打亂數(shù)據(jù),或者使用下面的方式,自己定義直接寫(xiě)。
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
那你就會(huì)收獲一堆的混亂數(shù)據(jù),因?yàn)槭褂眠@種交換的方式對(duì)tensor類(lèi)型的數(shù)據(jù)進(jìn)行操作,會(huì)導(dǎo)致里面的數(shù)據(jù)出現(xiàn)重復(fù)復(fù)制的問(wèn)題。
比如我y中的數(shù)據(jù)為【0,1,0,1,0,1】
在經(jīng)過(guò)幾次shuffle,其中的數(shù)據(jù)就變成了【1,1,1,1,1,1】。
數(shù)據(jù)頓時(shí)出現(xiàn)混亂。
正確的方式是先轉(zhuǎn)成numpy,再進(jìn)行交換數(shù)據(jù)
比如:
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
#轉(zhuǎn)成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()
#開(kāi)始隨機(jī)置換
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]
#轉(zhuǎn)回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
補(bǔ)充:python對(duì)訓(xùn)練數(shù)據(jù)集shuffle(打亂)的一些方式
1.通過(guò)數(shù)組來(lái)shuffle
image_list=[] # list of images
label_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.通過(guò)索引 Index 來(lái) shuffle
image_list=[] # list of images
label_list=[] # list of labels
##如果image_list存的是讀取的特征數(shù)據(jù),而不是圖片路徑,不要注釋后面兩句(list無(wú)法索引內(nèi)部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]
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Python深度學(xué)習(xí)之使用Pytorch搭建ShuffleNetv2
- python 如何查看pytorch版本
- 簡(jiǎn)述python&pytorch 隨機(jī)種子的實(shí)現(xiàn)
- 淺談pytorch、cuda、python的版本對(duì)齊問(wèn)題
- python、PyTorch圖像讀取與numpy轉(zhuǎn)換實(shí)例
- 基于python及pytorch中乘法的使用詳解
- python PyTorch參數(shù)初始化和Finetune
- python PyTorch預(yù)訓(xùn)練示例
- 我對(duì)PyTorch dataloader里的shuffle=True的理解
- pytorch 帶batch的tensor類(lèi)型圖像顯示操作
- Python深度學(xué)習(xí)之Pytorch初步使用