1. 程式人生 > 程式設計 >pytorch下大型資料集(大型圖片)的匯入方式

pytorch下大型資料集(大型圖片)的匯入方式

使用torch.utils.data.Dataset類 處理圖片資料時,

1. 我們需要定義三個基本的函式,以下是基本流程

class our_datasets(Data.Dataset):
 
  def __init__(self,root,is_resize=False,is_transfrom=False):
    #這裡只是個參考。按自己需求寫。
    self.root=root
    self.is_resize=is_resize
    self.is_transfrom=is_transfrom
 
    self.imgs_list=...#這裡建議儲存的是 圖片的路徑 而不是 圖片的資料
    self.labs_list=...
 
  def __getitem__(self,index):
 
    img_path,lab=self.imgs_list[index],self.labs_list[index]
    
    #這裡使用PIL庫讀取圖片資料.
    img_data = Image.open(img_path).convert('RGB')
 
    #這裡看自己需要,可以不要
    if self.is_resize:
      img_data = img_data.resize((self.is_resize[0],self.is_resize[1]),Image.ANTIALIAS)
    
    #但是資料轉換建議加上,很多時候都會用到
    if self.is_transfrom:
      img_data=self.is_transfrom(img_data)
    return img_data,lab
 
  def __len__(self):
 
    return len(self.imgs_list)

這裡,我將 讀取圖片 的步驟 放到 __getitem__ ,是因為 這樣放的話,對記憶體的要求會降低很多,我們只是將資料的路徑匯入了記憶體中,當需要讀取這個圖片資料時,再讀取,這樣更像是隨用隨取。如果將這部分放到 __init__ 裡面,會一次將 圖片資料都載入到 記憶體中,如果資料量太大,會直接卡死。

2.Dataset 類 返回的資料 型別 是與你讀取時的型別一致的。但是在 pytorch使用時,會提示

TypeError: batch must contain tensors,numbers,dicts or lists; found <class 'PIL.Image.Image'>

通常,在資料了不大時,我一般都是在 讀取資料後 加一句,轉換成 numpy.array型別。

但是,在處理較大型的資料時,這樣會很慢。

這時候,我建議 直接使用 torchvision來進行資料轉換。

is_transfrom=torchvision.transforms.ToTensor()

將 上例程式碼 加入 Dataset類中,這樣就會快很多。

以上這篇pytorch下大型資料集(大型圖片)的匯入方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。