PyTorch?Dataset與DataLoader使用超詳細講解
一、Dataset
Dataset 類提供一種方式去獲取數(shù)據(jù)及其標簽
主要有兩個目的:
- 獲取每一個數(shù)據(jù)及其標簽
- 獲取數(shù)據(jù)的總量大小
1. 在控制臺進行操作
Hymenoptera (膜翅目昆蟲)數(shù)據(jù)集下載地址:
鏈接: https://pan.baidu.com/s/1XKwXsAtE2yzZW2IsvBDpnw?pwd=8a5t
提取碼: 8a5t
這是一個螞蟻蜜蜂二分類的數(shù)據(jù)集,通常數(shù)據(jù)集有以下三種組織形式(上面的數(shù)據(jù)集屬于第一種):
- 不同的類別以文件夾的形式存在,文件夾中是該類別的圖片
- 圖片與標簽分別存儲,圖片在一個文件夾下,
label信息在另一個文件夾下 label直接寫在圖片名稱里
①獲取圖片的基本信息
在Pycharm 中,點擊下方的PythonConsole進入控制臺進行操作(通過控制臺可以看到變量的詳細信息)
首先加載圖片,逐行輸入下方代碼:
from PIL import Image img_path = "./dataset/hymenoptera_data/train/ants/0013035.jpg" img = Image.open(img_path)
此時我們就可以在右側(cè)看到相關(guān)變量的信息:

點擊img變量,可以查看圖片的詳細信息。通過控制臺執(zhí)行程序能夠直觀地獲取后續(xù)操作所需的數(shù)據(jù):

最后可以通過img.show()打開圖片查看:
②獲取文件的基本信息
同樣還是在控制臺逐行輸入以下代碼:
dir_path = "dataset/hymenoptera_data/train/ants" import os img_path_list = os.listdir(dir_path) img_path_list[0]
我們就可以獲取到文件夾下的文件名稱,由于是使用控制臺,我們還可以在右側(cè)查看列表的詳細信息:

因此在控制臺操作是有很大的優(yōu)點的,我們可以在控制臺逐行執(zhí)行已經(jīng)編寫好的文件中的語句,通過查看右側(cè)變量的值來判斷程序?qū)懙氖欠裼袉栴}
2. 編寫一個繼承Dataset 的類加載數(shù)據(jù)
下面的代碼也可以在控制臺運行(可以多行復制粘貼)來檢驗程序是否有誤
①定義 MyData類
導入所需頭文件:
from torch.utils.data import Dataset from PIL import Image import os
定義MyData類:
__init__:初始化函數(shù)__getitem__:返回指定下標的圖片和標簽__len__:返回數(shù)據(jù)集的大小
class MyData(Dataset):
def __init__(self, root_dir, label_dir):
self.root_dir = root_dir
self.label_dir = label_dir
self.path = os.path.join(self.root_dir, self.label_dir)
self.img_path = os.listdir(self.path)
def __getitem__(self, idx):
img_name = self.img_path[idx]
img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)
img = Image.open(img_item_path)
label = self.label_dir
return img, label
def __len__(self):
return len(self.img_path)其中os.path.join()可以實現(xiàn)多個路徑的合并且不出錯
②創(chuàng)建類的實例并調(diào)用
創(chuàng)建 MyData 類的實例:
if __name__ == "__main__":
root_dir = "../dataset/hymenoptera_data/train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)
調(diào)用類中寫好的函數(shù):
img, label = ants_dataset.__getitem__(3)
print(ants_dataset.__len__(), label)
img.show()
同時我們也可以通過下面這種方式用已有的數(shù)據(jù)集來創(chuàng)造數(shù)據(jù)集:
train_dataset = ants_dataset + bees_dataset
二、DataLoader
- DataLoader 類是為后面的網(wǎng)絡(luò)提供不同的數(shù)據(jù)形式
- DataLoader 會根據(jù)
batch_size的值對數(shù)據(jù)進行打包 - 導入所需的包
import torchvision from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter
加載數(shù)據(jù):
test_data = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=True)
測試:
img, target = test_data[0] print(img.shape) print(target)
進行日志記錄,開始訓練:
writer = SummaryWriter("dataloader")
for epoch in range(2):
step = 0
for data in test_loader:
imgs, targets = data
print(imgs.shape)
print(targets)
writer.add_images("Epoch: {}".format(epoch), imgs, step)
step = step + 1
writer.close()
到此這篇關(guān)于PyTorch Dataset與DataLoader使用超詳細講解的文章就介紹到這了,更多相關(guān)PyTorch Dataset與DataLoader內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
numpy 進行數(shù)組拼接,分別在行和列上合并的實例
今天小編就為大家分享一篇numpy 進行數(shù)組拼接,分別在行和列上合并的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Python正則表達式中g(shù)roup與groups的用法詳解
本文主要介紹了Python正則表達式中g(shù)roup與groups的用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02

