Pytorch資料載入 (一)

2021-10-08 11:28:06 字數 2179 閱讀 2039

在pytorch中,資料載入可以通過自定義的資料集物件實現。資料集物件被抽象為dataset類,實現自定義的資料集需要繼承datase類,並且實現python的兩個魔法方法。

a.**__getitem__**:返回一條資料或者樣本。如obj[index]等價於obj.__getitem__(index)。如果定義乙個 class dataset(....):

dataset =dataset(.....) dataset[0]就是按照索引獲取我們實際需要的目標以及目標的類別,拿簡單的分類問題進行描述。

b.**__len__**: 返回樣本的數量。同理我們呼叫len(obj)等價於obj.__len__() obj為實際dataset類的某乙個例項。

我們一kaggle經典的『貓狗分類而言』,將所有**放在同乙個檔案下,並且以檔名的字首作為其實際的類別。

如----cat.12456.jpg

這裡只是指定所有的路徑,意思就是

你只要能找到對應的以及其標籤的位置

就可以,不需要返回真正的標籤如0或者1以及

他的所代表的矩陣

當呼叫__getitem__時才會真正的讀取我們的

"""self.imgs=

[os.path.join(rootimg)

for img in imgs]

# 獲取所有的絕對路徑

def__getitem__

(self,index)

:"""

利用index索引我們上述所說的imgs的路徑列表

"""img_path = self.imgs[index]

label =1if

'dog'

in img_path.split(

'/')[-

1]else

0 pil_img = image.

open

(img_path)

# 讀取的矩陣np.array(pil_img)

array = np.array(pil_img)

data = torch.from_numpy(array)

return data,label

def__len__

(self)

:return

len(self.imgs)

dataset = dogcat(

'./data/dogcat/'

)img,lambel = dataset[0]

for img,label in dataset:

print

(img,label)

上述實現了簡單的自己資料集類的定義,具體結合dataloader實現mini-batch,這個在此處不做敘述。我主要是對dataset總是存在誤區,在此處簡單記錄一下。
問題:

利用上述**可能會因為尺寸不同而返回不同的矩陣,這對於batch訓練的神經網路來說不友好?

返回樣本的數值比較大[0,255],沒有歸一化至[0,1]

針對上述問題,transforms模組提供了對pil image物件和tensor物件的常用操作

對pil image的常見操作。

resize:調整尺寸

pad:填充

totensor:將pil image物件轉成tensor,會自動的將[0,255]歸一化到[0,1]

對tensor的常見操作如下。

normalize:標準化,即減均值,除以標準差

topliimage:將tensor轉為pil image

想實現多種資料處理時利用transforms.compose(),類似於nn.sequential()

pytorch載入資料

參考 pytorch深度學習快速入門教程 絕對通俗易懂!小土堆 可看到說明,dataset是乙個抽象類,我們重寫dataset時要繼承這個類,所有的子類都應該重寫 getitem 方法,這個方法作用是獲取資料及對應的labe。同時我們可以選擇性地去重寫 len 方法,其作用是獲取資料集長度。這裡我使...

pytorch十 資料載入

在pytorch中,資料載入可通過自定義的資料集物件實現。資料及物件被抽象為dataset類,實現自定義的資料集需要繼承dataset,並實現兩個python魔法方法。這裡我們以kaggle經典挑戰比賽 dogs vs cat 的資料為例,詳細講解如何處理資料。這是乙個分類問題,判斷一張是狗還是貓,...

Pytorch的資料載入

pytorch將資料集的處理過程標準化,提供了dataset基本的資料 類,並在torchvision中提供了眾多資料變換函式,資料載入的具體過程 主要分為3步 1 繼承dataset類 對於資料集的處理,pytorch提供了torch.utils.data.dataset這個抽象 類,在使用時只需...