婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Pytorch數據讀取與預處理該如何實現

Pytorch數據讀取與預處理該如何實現

熱門標簽:江蘇客服外呼系統廠家 在哪里辦理400電話號碼 平頂山外呼系統免費 千陽自動外呼系統 工廠智能電話機器人 原裝電話機器人 400電話申請服務商選什么 清遠360地圖標注方法 西藏智能外呼系統五星服務

  在煉丹時,數據的讀取與預處理是關鍵一步。不同的模型所需要的數據以及預處理方式各不相同,如果每個輪子都我們自己寫的話,是很浪費時間和精力的。Pytorch幫我們實現了方便的數據讀取與預處理方法,下面記錄兩個DEMO,便于加快以后的代碼效率。

  根據數據是否一次性讀取完,將DEMO分為:

  1、串行式讀取。也就是一次性讀取完所有需要的數據到內存,模型訓練時不會再訪問外存。通常用在內存足夠的情況下使用,速度更快。

  2、并行式讀取。也就是邊訓練邊讀取數據。通常用在內存不夠的情況下使用,會占用計算資源,如果分配的好的話,幾乎不損失速度。

  Pytorch官方的數據提取方式盡管方便編碼,但由于它提取數據方式比較死板,會浪費資源,下面對其進行分析。

1  串行式讀取

1.1  DEMO代碼

import torch 
from torch.utils.data import Dataset,DataLoader 
  
class MyDataSet(Dataset):# ————1————
 def __init__(self):  
  self.data = torch.tensor(range(10)).reshape([5,2])
  self.label = torch.tensor(range(5))

 def __getitem__(self, index):  
  return self.data[index], self.label[index]

 def __len__(self):  
  return len(self.data)
 
my_data_set = MyDataSet()# ————2————
my_data_loader = DataLoader(
 dataset=my_data_set,  # ————3————
 batch_size=2,     # ————4————
 shuffle=True,     # ————5————
 sampler=None,     # ————6————
 batch_sampler=None,  # ————7———— 
 num_workers=0 ,    # ————8———— 
 collate_fn=None,    # ————9———— 
 pin_memory=True,    # ————10———— 
 drop_last=True     # ————11————
)

for i in my_data_loader: # ————12————
 print(i)

  注釋處解釋如下:

  1、重寫數據集類,用于保存數據。除了 __init__() 外,必須實現 __getitem__() 和 __len__() 兩個方法。前一個方法用于輸出索引對應的數據。后一個方法用于獲取數據集的長度。

  2~5、 2準備好數據集后,傳入DataLoader來迭代生成數據。前三個參數分別是傳入的數據集對象、每次獲取的批量大小、是否打亂數據集輸出。

  6、采樣器,如果定義這個,shuffle只能設置為False。所謂采樣器就是用于生成數據索引的可迭代對象,比如列表。因此,定義了采樣器,采樣都按它來,shuffle再打亂就沒意義了。

  7、批量采樣器,如果定義這個,batch_size、shuffle、sampler、drop_last都不能定義。實際上,如果沒有特殊的數據生成順序的要求,采樣器并沒有必要定義。torch.utils.data 中的各種 Sampler 就是采樣器類,如果需要,可以使用它們來定義。

  8、用于生成數據的子進程數。默認為0,不并行。

  9、拼接多個樣本的方法,默認是將每個batch的數據在第一維上進行拼接。這樣可能說不清楚,并且由于這里可以探究一下獲取數據的速度,后面再詳細說明。

  10、是否使用鎖頁內存。用的話會更快,內存不充足最好別用。

  11、是否把最后小于batch的數據丟掉。

  12、迭代獲取數據并輸出。

1.2  速度探索

  首先看一下DEMO的輸出:

  輸出了兩個batch的數據,每組數據中data和label都正確排列,符合我們的預期。那么DataLoader是怎么把數據整合起來的呢?首先,我們把collate_fn定義為直接映射(不用它默認的方法),來查看看每次DataLoader從MyDataSet中讀取了什么,將上面部分代碼修改如下:

my_data_loader = DataLoader(
 dataset=my_data_set,  
 batch_size=2,      
 shuffle=True,      
 sampler=None,     
 batch_sampler=None,  
 num_workers=0 ,    
 collate_fn=lambda x:x, #修改處
 pin_memory=True,    
 drop_last=True     
)

  結果如下:

  輸出還是兩個batch,然而每個batch中,單個的data和label是在一個list中的。似乎可以看出,DataLoader是一個一個讀取MyDataSet中的數據的,然后再進行相應數據的拼接。為了驗證這點,代碼修改如下:

import torch 
from torch.utils.data import Dataset,DataLoader 
  
class MyDataSet(Dataset): 
 def __init__(self):  
  self.data = torch.tensor(range(10)).reshape([5,2])
  self.label = torch.tensor(range(5))

 def __getitem__(self, index):  
  print(index)     #修改處2
  return self.data[index], self.label[index]

 def __len__(self):  
  return len(self.data)
 
my_data_set = MyDataSet() 
my_data_loader = DataLoader(
 dataset=my_data_set,  
 batch_size=2,      
 shuffle=True,      
 sampler=None,     
 batch_sampler=None,  
 num_workers=0 ,    
 collate_fn=lambda x:x, #修改處1
 pin_memory=True,    
 drop_last=True     
)

for i in my_data_loader: 
 print(i)

  輸出如下:

  驗證了前面的猜想,的確是一個一個讀取的。如果數據集定義的不是格式化的數據,那還好,但是我這里定義的是tensor,是可以直接通過列表來索引對應的tensor的。因此,DataLoader的操作比直接索引多了拼接這一步,肯定是會慢很多的。一兩次的讀取還好,但在訓練中,大量的讀取累加起來,就會浪費很多時間了。

  自定義一個DataLoader可以證明這一點,代碼如下:

import torch 
from torch.utils.data import Dataset,DataLoader 
from time import time
  
class MyDataSet(Dataset): 
 def __init__(self):  
  self.data = torch.tensor(range(100000)).reshape([50000,2])
  self.label = torch.tensor(range(50000))

 def __getitem__(self, index):  
  return self.data[index], self.label[index]

 def __len__(self):  
  return len(self.data)

# 自定義DataLoader
class MyDataLoader():
 def __init__(self, dataset,batch_size):
  self.dataset = dataset
  self.batch_size = batch_size
 def __iter__(self):
  self.now = 0
  self.shuffle_i = np.array(range(self.dataset.__len__())) 
  np.random.shuffle(self.shuffle_i)
  return self
 
 def __next__(self): 
  self.now += self.batch_size
  if self.now = len(self.shuffle_i):
   indexes = self.shuffle_i[self.now-self.batch_size:self.now]
   return self.dataset.__getitem__(indexes)
  else:
   raise StopIteration

# 使用官方DataLoader
my_data_set = MyDataSet() 
my_data_loader = DataLoader(
 dataset=my_data_set,  
 batch_size=256,      
 shuffle=True,      
 sampler=None,     
 batch_sampler=None,  
 num_workers=0 ,    
 collate_fn=None, 
 pin_memory=True,    
 drop_last=True     
)

start_t = time()
for t in range(10):
 for i in my_data_loader: 
  pass
print("官方:", time() - start_t)
 
 
#自定義DataLoader
my_data_set = MyDataSet() 
my_data_loader = MyDataLoader(my_data_set,256)

start_t = time()
for t in range(10):
 for i in my_data_loader: 
  pass
print("自定義:", time() - start_t)

運行結果如下:

  以上使用batch大小為256,僅各讀取10 epoch的數據,都有30多倍的時間上的差距,更大的batch差距會更明顯。另外,這里用于測試的每個數據只有兩個浮點數,如果是圖像,所需的時間可能會增加幾百倍。因此,如果數據量和batch都比較大,并且數據是格式化的,最好自己寫數據生成器。

2  并行式讀取

2.1  DEMO代碼

import matplotlib.pyplot as plt
from torch.utils.data import DataLoader 
from torchvision import transforms 
from torchvision.datasets import ImageFolder 
 
path = r'E:\DataSets\ImageNet\ILSVRC2012_img_train\10-19\128x128'
my_data_set = ImageFolder(      #————1————
 root = path,            #————2————
 transform = transforms.Compose([  #————3————
  transforms.ToTensor(),
  transforms.CenterCrop(64)
 ]),
 loader = plt.imread         #————4————
)
my_data_loader = DataLoader(
 dataset=my_data_set,   
 batch_size=128,       
 shuffle=True,       
 sampler=None,       
 batch_sampler=None,    
 num_workers=0,      
 collate_fn=None,      
 pin_memory=True,      
 drop_last=True 
)      

for i in my_data_loader: 
 print(i)

  注釋處解釋如下:

  1/2、ImageFolder類繼承自DataSet類,因此可以按索引讀取圖像。路徑必須包含文件夾,ImageFolder會給每個文件夾中的圖像添加索引,并且每張圖像會給予其所在文件夾的標簽。舉個例子,代碼中my_data_set[0] 輸出的是圖像對象和它對應的標簽組成的列表。

  3、圖像到格式化數據的轉換組合。更多的轉換方法可以看 transform 模塊。

  4、圖像法的讀取方式,默認是PIL.Image.open(),但我發現plt.imread()更快一些。

  由于是邊訓練邊讀取,transform會占用很多時間,因此可以先將圖像轉換為需要的形式存入外存再讀取,從而避免重復操作。

  其中transform.ToTensor()會把正常讀取的圖像轉換為torch.tensor,并且像素值會映射至[0,1][0,1]。由于plt.imread()讀取png圖像時,像素值在[0,1][0,1],而讀取jpg圖像時,像素值卻在[0,255][0,255],因此使用transform.ToTensor()能將圖像像素區間統一化。

以上就是Pytorch數據讀取與預處理該如何實現的詳細內容,更多關于Pytorch數據讀取與預處理的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • PyTorch數據讀取的實現示例
  • pytorch讀取圖像數據轉成opencv格式實例
  • Pytorch 實現數據集自定義讀取
  • PyTorch讀取Cifar數據集并顯示圖片的實例講解

標簽:安慶 西安 隨州 天水 日照 白城 股票 錦州

巨人網絡通訊聲明:本文標題《Pytorch數據讀取與預處理該如何實現》,本文關鍵詞  Pytorch,數據,讀取,與,預處,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Pytorch數據讀取與預處理該如何實現》相關的同類信息!
  • 本頁收集關于Pytorch數據讀取與預處理該如何實現的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久久久免费观看| 777色狠狠一区二区三区| 在线视频中文字幕一区二区| 国产亚洲短视频| 蜜臀精品一区二区三区在线观看| 欧美吻胸吃奶大尺度电影| 亚洲欧美日韩中文字幕一区二区三区| 国产91精品欧美| 最新热久久免费视频| 欧美性生活影院| 日本成人在线一区| 国产日韩欧美在线一区| 97se亚洲国产综合自在线观| 国产人妖乱国产精品人妖| 色综合久久久久久久久久久| 亚洲一区二三区| 精品国产免费一区二区三区香蕉| 国产福利不卡视频| 亚洲欧美偷拍卡通变态| 欧美日韩的一区二区| 国产久卡久卡久卡久卡视频精品| 欧美国产日本韩| 7777女厕盗摄久久久| 国产另类ts人妖一区二区| 一区二区三区日韩欧美| 欧美精品一区二区三区视频| 色综合中文字幕国产| 丝袜诱惑制服诱惑色一区在线观看| 日韩视频国产视频| 91麻豆产精品久久久久久| 男人操女人的视频在线观看欧美| 国产欧美日韩精品一区| 欧美视频一二三区| 久久综合999| 一区二区三区欧美| 欧美大尺度电影在线| 有码一区二区三区| 欧美激情一区二区三区蜜桃视频| 亚洲国产精品自拍| 美女视频网站黄色亚洲| 3atv一区二区三区| 久久草av在线| 久久综合九色综合97婷婷| 日韩美女视频19| 国产亚洲欧洲一区高清在线观看| 亚洲视频一区在线| 精品国产青草久久久久福利| 欧美午夜精品一区二区蜜桃| 高清国产一区二区三区| 美女精品一区二区| 午夜私人影院久久久久| 日本一区二区三区电影| 日韩午夜av一区| 欧美日韩国产免费一区二区| 91国产福利在线| av男人天堂一区| 国产99一区视频免费| 国产成人午夜精品影院观看视频| 激情五月激情综合网| 免费不卡在线观看| 老司机午夜精品| 久久se精品一区二区| 久久精品国产亚洲aⅴ | 国内一区二区在线| 日本视频一区二区三区| 亚洲在线视频一区| 亚洲国产精品欧美一二99| 亚洲在线免费播放| 亚洲动漫第一页| 日本成人中文字幕| 国产一区二区伦理片| 国产一区欧美二区| 激情综合色播五月| 国产精品亚洲视频| 国产福利91精品一区| 99久久99久久精品国产片果冻| 国产精品一级黄| 欧美偷拍一区二区| 99re热视频这里只精品| 成人综合激情网| 99国产精品国产精品毛片| 91理论电影在线观看| 在线观看一区二区精品视频| 欧美日韩一区二区三区在线| 欧美一卡二卡三卡| 亚洲网友自拍偷拍| 国产在线播放一区二区三区| 丝袜诱惑制服诱惑色一区在线观看| 国产在线视频精品一区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 日日夜夜精品视频天天综合网| 久久这里只有精品首页| 人人超碰91尤物精品国产| 天天av天天翘天天综合网色鬼国产 | 久久婷婷久久一区二区三区| 日韩亚洲欧美高清| 久久新电视剧免费观看| 亚洲天堂精品视频| 亚洲a一区二区| 韩国午夜理伦三级不卡影院| 成人午夜电影久久影院| 在线观看日韩高清av| 日韩欧美一级在线播放| 国产精品天干天干在观线| 亚洲二区在线观看| 国产剧情一区在线| 欧美日韩一区国产| 久久精品视频网| 亚洲成人自拍一区| 国产麻豆精品theporn| 欧美中文字幕一二三区视频| 欧美一级二级三级蜜桃| 欧美国产国产综合| 午夜国产精品一区| 成人黄色综合网站| 欧美精品一区二区久久久| 国产精品不卡一区| 日韩高清在线不卡| 91国产免费观看| 亚洲国产精华液网站w| 免费在线观看不卡| 欧美在线观看视频一区二区| 久久先锋影音av鲁色资源网| 午夜日韩在线观看| 99精品在线免费| 国产精品美女www爽爽爽| 六月婷婷色综合| 欧美日韩国产首页| 亚洲综合精品久久| 色综合咪咪久久| 国产欧美1区2区3区| 麻豆视频一区二区| 7777精品伊人久久久大香线蕉经典版下载| 国产精品午夜在线| 国产一区二区不卡| 久久久久88色偷偷免费| 日韩高清不卡一区二区| 欧美视频自拍偷拍| 一本久久a久久免费精品不卡| 精品久久久久久久久久久院品网 | 精品国产凹凸成av人导航| 午夜电影一区二区三区| 日韩精品亚洲一区| 裸体一区二区三区| 91麻豆精品国产91久久久使用方法| 中文字幕一区二区不卡| 国产91精品在线观看| 中文无字幕一区二区三区| 国产一区二三区好的| 日韩精品一区二区三区swag| 日本欧美在线观看| 日韩免费一区二区三区在线播放| 日韩精品免费视频人成| 欧美日本一道本| 日韩高清欧美激情| 欧美videos大乳护士334| 国产精品一区二区三区网站| 欧美激情一区二区三区全黄| 成人免费高清视频| 亚洲欧美日韩国产中文在线| 欧洲视频一区二区| 午夜精品在线看| 欧美一区二区视频网站| 毛片av一区二区| 日本一区二区三区电影| 欧美日韩性生活| 免费精品视频在线| 久久奇米777| 99re成人精品视频| 悠悠色在线精品| 91精品国产综合久久久久久久 | 日韩欧美色电影| 韩国视频一区二区| 亚洲女性喷水在线观看一区| 欧美日韩中文另类| 国产一区二区精品在线观看| 一区二区三区中文免费| 欧美一区二区三区四区五区| 国产69精品一区二区亚洲孕妇| 亚洲欧美国产77777| 精品日韩av一区二区| 91丨porny丨在线| 亚洲成a人片综合在线| www成人在线观看| 97精品视频在线观看自产线路二| 亚洲成av人片在线观看无码| 精品国产免费一区二区三区香蕉| 99精品国产热久久91蜜凸| 青青草视频一区| 亚洲精品成人在线| www亚洲一区| 欧美男人的天堂一二区| 成人av小说网| 国产美女在线观看一区| 亚洲自拍偷拍av| 自拍偷拍欧美精品| 久久久激情视频| 91麻豆精品91久久久久久清纯 | 在线观看日韩毛片| 日韩一区二区三区免费观看|