使用torch.utils.data.Dataset類(lèi) 處理圖片數(shù)據(jù)時(shí),
1. 我們需要定義三個(gè)基本的函數(shù),以下是基本流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
class our_datasets(Data.Dataset): def __init__( self ,root,is_resize = False ,is_transfrom = False ): #這里只是個(gè)參考。按自己需求寫(xiě)。 self .root = root self .is_resize = is_resize self .is_transfrom = is_transfrom self .imgs_list = ... #這里建議保存的是 圖片的路徑 而不是 圖片的數(shù)據(jù) self .labs_list = ... def __getitem__( self , index): img_path,lab = self .imgs_list[index], self .labs_list[index] #這里使用PIL庫(kù)讀取圖片數(shù)據(jù). 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) #但是數(shù)據(jù)轉(zhuǎn)換建議加上,很多時(shí)候都會(huì)用到 if self .is_transfrom: img_data = self .is_transfrom(img_data) return img_data,lab def __len__( self ): return len ( self .imgs_list) |
這里,我將 讀取圖片 的步驟 放到 __getitem__ ,是因?yàn)?這樣放的話,對(duì)內(nèi)存的要求會(huì)降低很多,我們只是將數(shù)據(jù)的路徑導(dǎo)入了內(nèi)存中,當(dāng)需要讀取這個(gè)圖片數(shù)據(jù)時(shí),再讀取,這樣更像是隨用隨取。如果將這部分放到 __init__ 里面,會(huì)一次將 圖片數(shù)據(jù)都加載到 內(nèi)存中,如果數(shù)據(jù)量太大,會(huì)直接卡死。
2.Dataset 類(lèi) 返回的數(shù)據(jù) 類(lèi)型 是與你讀取時(shí)的類(lèi)型一致的。但是在 pytorch使用時(shí),會(huì)提示
1
|
TypeError: batch must contain tensors, numbers, dicts or lists; found < class 'PIL.Image.Image' > |
通常,在數(shù)據(jù)了不大時(shí),我一般都是在 讀取數(shù)據(jù)后 加一句,轉(zhuǎn)換成 numpy.array類(lèi)型。
但是,在處理較大型的數(shù)據(jù)時(shí),這樣會(huì)很慢。
這時(shí)候,我建議 直接使用 torchvision來(lái)進(jìn)行數(shù)據(jù)轉(zhuǎn)換。
1
|
is_transfrom = torchvision.transforms.ToTensor() |
將 上例代碼 加入 Dataset類(lèi)中,這樣就會(huì)快很多。
以上這篇pytorch下大型數(shù)據(jù)集(大型圖片)的導(dǎo)入方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/qq_36285997/article/details/82463959