在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這個抽象 類,在使用時只需...