pytorch學習---dataset


1、dataset是初入pytorch最重要的東西,在復現項目的時候,最需要改的就是數據集。

 如果弄明白了pytorch中dataset類,你可以創建適應任意模型的數據集接口。

2、所謂數據集,無非就是一組{x:y}的集合嗎,你只需要在這個類里說明“有一組{x:y}的集合”就可以了。

對於圖像分類任務,圖像+分類

對於目標檢測任務,圖像+bbox、分類

對於超分辨率任務,低分辨率圖像+超分辨率圖像

對於文本分類任務,文本+分類

...

你只需定義好這個項目的x和y是什么。好了,上面都是扯閑篇,我們直接看dataset代碼:

鏈接:https://blog.csdn.net/leviopku/article/details/99958182

這個鏈接非常的詳細。

 

Pytorch用torch.utils.data.Dataset構建數據集,想要構建自己的數據集,則需繼承Dataset類,並重寫兩個方法:

    • __len__ :定義整個數據集的長度。使用len(dataset)時會被調用。
    • __getitem__:用於索引數據集中的數據,比如dataset[i]

 

Dataset基類
PyTorch 讀取圖片,主要是通過 Dataset 類,所以先簡單了解一下 Dataset 類。Dataset
類作為所有的 datasets 的基類存在,所有的 datasets 都需要繼承它。
看一下源碼:

這里有一個getitem函數,getitem函數接收一個index,然后返回圖片數據和標簽,這個index通常是指一個list的index,這個list的每個元素就包含了圖片數據的路徑和標簽信息。

list的制作方法通常是將圖片的路徑和標簽信息存儲在一個txt中,然后從txt中讀取,所以總結一下基本流程:

制作存儲了圖片路徑和標簽信息的txt
將這些信息轉化成list,list的每一個元素對應一個樣本
通過getitem函數,讀取數據和標簽。
其實說着了些都沒用,因為在訓練代碼里是感覺不到這些操作的,只會看到通過DataLoader就可以獲取一個batch的數據,其實觸發去讀取圖片這些操作的是DataLoader里的__iter__(self)(后面再將)。

總而言之,要讓PyTorch讀取自己的數據集,只要兩步:

制作圖片數據的索引
構建Dataset子類
制作圖片數據索引
非常簡單,就是一些基本的操作,百度一下“”python如何保存txt文件“”就可以知道了。
然后一般來說,txt都是這樣的格式
./Data/train/01.png 0
./Data/train/02.png 0
./Data/train/03.png 1
./Data/train/04.png 1

構建Dataset子類
下面我們構建一下Dataset的子類,叫他MyDataset類:

from PIL import Image
from torch.utils.data import Dataset
class MyDataset(Datset):
def __init__(self,txt_path,transform=None,target_transform=None):
fh = open(txt_path,'r')
imgs = []
for line in fh:
line = line.rstrip()
words = line.split()
imgs.append((words[0].int(words[1])))
self.imgs = imgs
self.transform = transform
def __getitem__(self,index):
fn,label = self.imgs[index]
img=Image.open(fn).convert('RGB')
if self.transform is not None:
img = self.transform(img)
return img,label
def __len__(self):
return len(sefl.imgs)

 

 

Init
初始化中,我們從已經准備好的txt中獲取了圖片的路徑和表親啊,並且春初在self.imgs這意味着self.imgs是一個list就像上面我們講的那樣

初始化中,初始化了transform,transform是一個Compose類型,transform中包含一個list,list中定義了各種對圖像進行的操作,比如隨機剪裁,旋轉反轉等。

一個圖片都進來之后,會經過數據處理(數據增強),最終變成另外一張圖片,也就是模型的輸入數據。但是PyTorch的數據增強是將原始圖片進行處理,是不會生成新的圖片。因此假如我們使用randomcrop這樣的隨機操作的時候,每次epoch輸入進來的圖片不會是一摸一樣的,達到樣本多樣性的功能

getitem
self.imgs是一個list,每一個元素都是一個二元tuple,這很好理解(str1,str2)這樣的
利用Image.open對圖片進行讀取,img類型為Image,mode=‘RGB’
用transform對圖片進行處理,里面可能有什么 標准化(減均值除以標准差),隨機剪裁什么的(后面會細說)
這樣Mydataset就構建好了,剩下的操作就交給DataLoader,在DataLoader中,會觸發Mydataset中的getitem函數讀取一張圖片的數據和標簽,並將多個圖片拼接成一個batch返回,每一個batch才是模型真正的輸入。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM