日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【小白学PyTorch】3.浅谈Dataset和Dataloader

發布時間:2025/3/8 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【小白学PyTorch】3.浅谈Dataset和Dataloader 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄:

  • 1 Dataset基類

  • 2 構建Dataset子類

    • 2.1 __Init__

    • 2.2 __getitem__

  • 3 dataloader

1 Dataset基類

PyTorch 讀取其他的數據,主要是通過 Dataset 類,所以先簡單了解一下 Dataset 類。在看很多PyTorch的代碼的時候,也會經常看到dataset這個東西的存在。Dataset類作為所有的 datasets 的基類存在,所有的 datasets 都需要繼承它。

先看一下源碼:

這里有一個__getitem__函數,__getitem__函數接收一個index,然后返回圖片數據和標簽,這個index通常是指一個list的index,這個list的每個元素就包含了圖片數據的路徑和標簽信息。之后會舉例子來講解這個邏輯

其實說著了些都沒用,因為在訓練代碼里是感覺不到這些操作的,只會看到通過DataLoader就可以獲取一個batch的數據,這是觸發去讀取圖片這些操作的是DataLoader里的__iter__(self)(后面再講)。

2 構建Dataset子類

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

import?torch? from?torch.utils.data?import?Dataset,DataLoaderclass?MyDataset(Dataset):def?__init__(self):self.data?=?torch.tensor([[1,2,3],[2,3,4],[3,4,5],[4,5,6]])self.label?=?torch.LongTensor([1,1,0,0])def?__getitem__(self,index):return?self.data[index],self.label[index]def?__len__(self):return?len(self.data)

2.1 Init

  • 初始化中,一般是把數據直接保存在這個類的屬性中。像是self.data,self.label

2.2 getitem

  • index是一個索引,這個索引的取值范圍是要根據__len__這個返回值確定的,在上面的例子中,__len__的返回值是4,所以這個index會在0,1,2,3這個范圍內。

3 dataloader

從上文中,我們知道了MyDataset這個類中的__getitem__的返回值,應該是某一個樣本的數據和標簽(如果是測試集的dataset,那么就只返回數據),在梯度下降的過程中,一般是需要將多個數據組成batch,這個需要我們自己來組合嗎?不需要的,所以PyTorch中存在DataLoader這個迭代器(這個名詞用的準不準確有待考究)。

繼續上面的代碼,我們接著寫代碼:

mydataloader?=?DataLoader(dataset=mydataset,batch_size=1)

我們現在創建了一個DataLoader的實例,并且把之前實例化的mydataset作為參數輸入進去,并且還輸入了batch_size這個參數,現在我們使用的batch_size是1.下面來用for循環來遍歷這個dataloader:

for?i,(data,label)?in?enumerate(mydataloader):print(data,label)

輸出結果是:

意料之中的結果,總共輸出了4個batch,每個batch都是只有1個樣本(數據+標簽),值得注意的是,這個輸出過程是順序的

我們稍微修改一下上面的DataLoader的參數:

mydataloader?=?DataLoader(dataset=mydataset,batch_size=2,shuffle=True)for?i,(data,label)?in?enumerate(mydataloader):print(data,label)

結果是:

可以看到每一個batch內出現了2個樣本。假如我們再運行一遍上面的代碼,得到:

兩次結果不同,這是因為shuffle=True,dataset中的index不再是按照順序從0到3了,而是亂序,可能是[0,1,2,3],也可能是[2,3,1,0]。

【個人感想】

Dataloader和Dataset兩個類是非常方便的,因為這個可以快速的做出來batch數據,修改batch_size和亂序都非常地方便。有下面兩個希望注意的地方:

  • 一般標簽值應該是Long整數的,所以標簽的tensor可以用torch.LongTensor(數據)或者用.long()來轉化成Long整數的形式。

  • 如果要使用PyTorch的GPU訓練的話,一般是先判斷cuda是否可用,然后把數據標簽都用to()放到GPU顯存上進行GPU加速。

  • device?=?'cuda'?if?torch.cuda.is_available()?else?'cpu' for?i,(data,label)?in?enumerate(mydataloader):data?=?data.to(device)label?=?label.to(device)print(data,label)

    看一下輸出:

    - END -

    往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/662nyZF本站qq群1003271085。加入微信群請掃碼進群(如果是博士或者準備讀博士請說明):

    總結

    以上是生活随笔為你收集整理的【小白学PyTorch】3.浅谈Dataset和Dataloader的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。