日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

PyTorch?Dataset與DataLoader使用超詳細講解_python

作者:竹清蘭香 ? 更新時間: 2022-11-24 編程語言

一、Dataset

Dataset 類提供一種方式去獲取數據及其標簽

主要有兩個目的:

  • 獲取每一個數據及其標簽
  • 獲取數據的總量大小

1. 在控制臺進行操作

Hymenoptera (膜翅目昆蟲)數據集下載地址:

鏈接: https://pan.baidu.com/s/1XKwXsAtE2yzZW2IsvBDpnw?pwd=8a5t

提取碼: 8a5t?

這是一個螞蟻蜜蜂二分類的數據集,通常數據集有以下三種組織形式(上面的數據集屬于第一種):

  • 不同的類別以文件夾的形式存在,文件夾中是該類別的圖片
  • 圖片與標簽分別存儲,圖片在一個文件夾下,label信息在另一個文件夾下
  • label直接寫在圖片名稱里

①獲取圖片的基本信息

在Pycharm 中,點擊下方的PythonConsole進入控制臺進行操作(通過控制臺可以看到變量的詳細信息)

首先加載圖片,逐行輸入下方代碼:

from PIL import Image
img_path = "./dataset/hymenoptera_data/train/ants/0013035.jpg"
img = Image.open(img_path)

此時我們就可以在右側看到相關變量的信息:

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

最后可以通過img.show()打開圖片查看:

②獲取文件的基本信息

同樣還是在控制臺逐行輸入以下代碼:

dir_path = "dataset/hymenoptera_data/train/ants"
import os
img_path_list = os.listdir(dir_path)
img_path_list[0]

我們就可以獲取到文件夾下的文件名稱,由于是使用控制臺,我們還可以在右側查看列表的詳細信息:

因此在控制臺操作是有很大的優點的,我們可以在控制臺逐行執行已經編寫好的文件中的語句,通過查看右側變量的值來判斷程序寫的是否有問題

2. 編寫一個繼承Dataset 的類加載數據

下面的代碼也可以在控制臺運行(可以多行復制粘貼)來檢驗程序是否有誤

①定義 MyData類

導入所需頭文件:

from torch.utils.data import Dataset
from PIL import Image
import os

定義MyData類:

  • __init__:初始化函數
  • __getitem__:返回指定下標的圖片和標簽
  • __len__:返回數據集的大小
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()可以實現多個路徑的合并且不出錯

②創建類的實例并調用

創建 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)

調用類中寫好的函數:

    img, label = ants_dataset.__getitem__(3)
    print(ants_dataset.__len__(), label)
    img.show()

同時我們也可以通過下面這種方式用已有的數據集來創造數據集:

train_dataset = ants_dataset + bees_dataset

二、DataLoader

  • DataLoader 類是為后面的網絡提供不同的數據形式
  • DataLoader 會根據batch_size的值對數據進行打包
  • 導入所需的包
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

加載數據:

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()

原文鏈接:https://blog.csdn.net/weixin_53312629/article/details/126616169

欄目分類
最近更新