最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的Dataset和Dataloader詳解

 更新時(shí)間:2023年07月29日 08:53:28   作者:菜菜01  
這篇文章主要介紹了Python中的Dataset和Dataloader詳解,DataLoader與DataSet是PyTorch數(shù)據(jù)讀取的核心,是構(gòu)建一個(gè)可迭代的數(shù)據(jù)裝載器,每次執(zhí)行循環(huán)的時(shí)候,就從中讀取一批Batchsize大小的樣本進(jìn)行訓(xùn)練,需要的朋友可以參考下

Dataset,Dataloader是什么?

  • Dataset:負(fù)責(zé)可被Pytorch使用的數(shù)據(jù)集的創(chuàng)建
  • Dataloader:向模型中傳遞數(shù)據(jù)

為什么要了解Dataloader

? 因?yàn)槟愕纳窠?jīng)網(wǎng)絡(luò)表現(xiàn)不佳的主要原因之一可能是由于數(shù)據(jù)不佳或理解不足。

因此,以更直觀的方式理解、預(yù)處理數(shù)據(jù)并將其加載到網(wǎng)絡(luò)中非常重要。

? 通常,我們?cè)谀J(rèn)或知名數(shù)據(jù)集(如 MNIST 或 CIFAR)上訓(xùn)練神經(jīng)網(wǎng)絡(luò),可以輕松地實(shí)現(xiàn)預(yù)測(cè)和分類(lèi)類(lèi)型問(wèn)題的超過(guò) 90% 的準(zhǔn)確度。

但是那是因?yàn)檫@些數(shù)據(jù)集組織整齊且易于預(yù)處理。

但是處理自己的數(shù)據(jù)集時(shí),我們常常無(wú)法達(dá)到這樣高的準(zhǔn)確率

Dataloader 的使用

載入相關(guān)類(lèi)

from torch.utils.data import Dataloader

設(shè)置相關(guān)參數(shù)

from torch.utils.data import DataLoader
DataLoader(
    dataset,
    batch_size=1,
    shuffle=False,
    num_workers=0,
    collate_fn=None,
    pin_memory=False,
 )
"""
dataset:是數(shù)據(jù)集
batch_size:是指一次迭代中使用的訓(xùn)練樣本數(shù)。通常我們將數(shù)據(jù)分成訓(xùn)練集和測(cè)試集,并且我們可能有不同的批量大小。
shuffle:是傳遞給 DataLoader 類(lèi)的另一個(gè)參數(shù)。該參數(shù)采用布爾值(真/假)。如果 shuffle 設(shè)置為 True,則所有樣本都被打亂并分批加載。否則,它們會(huì)被一個(gè)接一個(gè)地發(fā)送,而不會(huì)進(jìn)行任何洗牌。
num_workers:允許多處理來(lái)增加同時(shí)運(yùn)行的進(jìn)程數(shù)
collate_fn:合并數(shù)據(jù)集
pin_memory:鎖頁(yè)內(nèi)存:將張量固定在內(nèi)存中
"""

以minist為例子

# Import MNIST
from torchvision.datasets import MNIST
# Download and Save MNIST 
data_train = MNIST('~/mnist_data', train=True, download=True)
# Print Data
print(data_train)
print(data_train[12])
#Dataset MNIST Number of datapoints: 60000 Root location: /Users/viharkurama/mnist_data Split: Train (<PIL.Image.Image image mode=L size=28x28 at 0x11164A100>, 3)

現(xiàn)在讓嘗試提取元組,其中第一個(gè)值對(duì)應(yīng)于圖像,第二個(gè)值對(duì)應(yīng)于其各自的標(biāo)簽。

下面是代碼片段:

import matplotlib.pyplot as plt
random_image = data_train[0][0]
random_image_label = data_train[0][1]
# Print the Image using Matplotlib
plt.imshow(random_image)
print("The label of the image is:", random_image_label)

讓我們使用 DataLoader 類(lèi)來(lái)加載數(shù)據(jù)集,如下所示。

import torch
from torchvision import transforms
data_train = torch.utils.data.DataLoader(
    MNIST(
          '~/mnist_data', train=True, download=True, 
          transform = transforms.Compose([
              transforms.ToTensor()
          ])),
          batch_size=64,
          shuffle=True
          )
for batch_idx, samples in enumerate(data_train):
      print(batch_idx, samples)

這就是我們使用 DataLoader 加載簡(jiǎn)單數(shù)據(jù)集的方式。 但是,我們不能總是對(duì)每個(gè)數(shù)據(jù)集都依賴(lài)已經(jīng)有的數(shù)據(jù)集,要是自己的數(shù)據(jù)集怎么辦。

定義自己的數(shù)據(jù)集

我們將創(chuàng)建一個(gè)由數(shù)字和文本組成的簡(jiǎn)單自定義數(shù)據(jù)集

先介紹兩個(gè)方法

#__getitem__() 方法通過(guò)索引返回?cái)?shù)據(jù)集中選定的樣本。
#__len__() 方法返回?cái)?shù)據(jù)集的總大小。例如,如果您的數(shù)據(jù)集包含 1,00,000 個(gè)樣本,則 len 方法應(yīng)返回 1,00,000。
class Dataset(object):
    def __getitem__(self, index):
        raise NotImplementedError
    def __len__(self):
        raise NotImplementedError

? 創(chuàng)建自定義數(shù)據(jù)集并不復(fù)雜,但作為加載數(shù)據(jù)的典型過(guò)程的附加步驟,有必要構(gòu)建一個(gè)接口以獲得良好的抽象(至少可以說(shuō)是一個(gè)很好的語(yǔ)法糖)。

現(xiàn)在我們將創(chuàng)建一個(gè)包含數(shù)字及其平方值的新數(shù)據(jù)集。 讓我們將數(shù)據(jù)集稱(chēng)為 SquareDataset。 其目的是返回 [a,b] 范圍內(nèi)的值的平方。

下面是相關(guān)代碼:

import torch
import torchvision
from torch.utils.data import Dataset, DataLoader
from torchvision import datasets, transforms
class SquareDataset(Dataset):
     def __init__(self, a=0, b=1):
         super(Dataset, self).__init__()
         assert a <= b
         self.a = a
         self.b = b
     def __len__(self):
         return self.b - self.a + 1
     def __getitem__(self, index):
        assert self.a <= index <= self.b
        return index, index**2
data_train = SquareDataset(a=1,b=64)
data_train_loader = DataLoader(data_train, batch_size=64, shuffle=True)
print(len(data_train))

? 在上面的代碼塊中,我們創(chuàng)建了一個(gè)名為 SquareDataset 的 Python 類(lèi),它繼承了 PyTorch 的 Dataset 類(lèi)。

接下來(lái),我們調(diào)用了一個(gè) init() 構(gòu)造函數(shù),其中 a 和 b 分別被初始化為 0 和 1。 超類(lèi)用于從繼承的 Dataset 類(lèi)中訪(fǎng)問(wèn) len 和 get_item 方法。

接下來(lái)我們使用 assert 語(yǔ)句來(lái)檢查 a 是否小于或等于 b,因?yàn)槲覀兿胍獎(jiǎng)?chuàng)建一個(gè)數(shù)據(jù)集,其中值將位于 a 和 b 之間。

? 然后,我們使用 SquareDataset 類(lèi)創(chuàng)建了一個(gè)數(shù)據(jù)集,其中數(shù)據(jù)值的范圍為 1 到 64。我們將其加載到名為 data_train 的變量中。

最后,Dataloader 類(lèi)在 data_train_loader 中存儲(chǔ)的數(shù)據(jù)上創(chuàng)建了一個(gè)迭代器,batch_size 初始化為 64,shuffle 設(shè)置為 True。

如何使用transform

? 當(dāng)你學(xué)會(huì)怎么定義自己的數(shù)據(jù)集的時(shí)候,你可能會(huì)想要更近 一步的操作,對(duì)于你自己的數(shù)據(jù)集進(jìn)行剪切或者變換

? 以CIFAR10為例子

  • 將所有圖像調(diào)整為 32×32
  • 對(duì)圖像應(yīng)用中心裁剪變換
  • 將裁剪后的圖像轉(zhuǎn)換為張量
  • 標(biāo)準(zhǔn)化圖像

導(dǎo)入必要的模塊

import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np

接下來(lái),我們將定義一個(gè)名為 transforms 的變量,我們?cè)谄渲邪错樞蚓帉?xiě)所有預(yù)處理步驟。我們使用 Compose 類(lèi)將所有轉(zhuǎn)換操作鏈接在一起。

transform = transforms.Compose([
    # resize
    transforms.Resize(32),
    # center-crop
    transforms.CenterCrop(32),
    # to-tensor
    transforms.ToTensor(),
    # normalize
    transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])
"""
resize:此調(diào)整大小轉(zhuǎn)換將所有圖像轉(zhuǎn)換為定義的大小。在這種情況下,我們要將所有圖像的大小調(diào)整為 32×32。因此,我們將 32 作為參數(shù)傳遞。
center-crop:接下來(lái),我們使用 CenterCrop 變換裁剪圖像。 我們發(fā)送的參數(shù)也是分辨率/大小,但由于我們已經(jīng)將圖像大小調(diào)整為 32x32,因此圖像將與此裁剪中心對(duì)齊。 這意味著圖像將從中心裁剪 32 個(gè)單位(垂直和水平)。
to-tensor:我們使用 ToTensor() 方法將圖像轉(zhuǎn)換為張量數(shù)據(jù)類(lèi)型。
normalize:這將張量中的所有值歸一化,使它們位于 0.5 和 1 之間。
"""

在下一步中,在執(zhí)行我們剛剛定義的轉(zhuǎn)換之后,我們將使用 trainloader 將 CIFAR 數(shù)據(jù)集加載到訓(xùn)練集中。

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=False)

到此這篇關(guān)于Python中的Dataset和Dataloader詳解的文章就介紹到這了,更多相關(guān)Dataset和Dataloader詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于python開(kāi)發(fā)圖片比例調(diào)整工具的示例代碼

    基于python開(kāi)發(fā)圖片比例調(diào)整工具的示例代碼

    在數(shù)字化時(shí)代,我們經(jīng)常需要將圖片調(diào)整為不同的寬高比以適應(yīng)各種顯示設(shè)備和平臺(tái),本文將使用Python開(kāi)發(fā)圖片比例調(diào)整工具,希望對(duì)大家有所幫助
    2025-09-09
  • 基于python select.select模塊通信的實(shí)例講解

    基于python select.select模塊通信的實(shí)例講解

    下面小編就為大家?guī)?lái)一篇基于python select.select模塊通信的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 如何通過(guò)Python3和ssl實(shí)現(xiàn)加密通信功能

    如何通過(guò)Python3和ssl實(shí)現(xiàn)加密通信功能

    這篇文章主要介紹了如何通過(guò)Python3和ssl實(shí)現(xiàn)加密通信功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 這十大Python庫(kù)你真應(yīng)該知道

    這十大Python庫(kù)你真應(yīng)該知道

    這篇文章主要為大家詳細(xì)介紹了十大Python庫(kù),學(xué)習(xí)數(shù)據(jù)分析應(yīng)該弄清楚該學(xué)習(xí)什么技能,該使用哪種工具,本文具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 用python實(shí)現(xiàn)前向分詞最大匹配算法的示例代碼

    用python實(shí)現(xiàn)前向分詞最大匹配算法的示例代碼

    這篇文章主要介紹了用python實(shí)現(xiàn)前向分詞最大匹配算法的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 人工智能學(xué)習(xí)PyTorch教程之層和塊

    人工智能學(xué)習(xí)PyTorch教程之層和塊

    這篇文章主要為大家介紹了人工智能學(xué)習(xí)Pytorch教程中的層和塊的相關(guān)知識(shí)點(diǎn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Python中注釋使用方法舉例詳解

    Python中注釋使用方法舉例詳解

    在Python編程語(yǔ)言中注釋是必不可少的一部分,它有助于提高代碼的可讀性和維護(hù)性,這篇文章主要介紹了Python中注釋使用方法的相關(guān)資料,需要的朋友可以參考下
    2025-06-06
  • Python實(shí)現(xiàn)深度遍歷和廣度遍歷的方法

    Python實(shí)現(xiàn)深度遍歷和廣度遍歷的方法

    今天小編就為大家分享一篇Python實(shí)現(xiàn)深度遍歷和廣度遍歷的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • python安裝scipy的步驟解析

    python安裝scipy的步驟解析

    這篇文章主要介紹了python安裝scipy的步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Numpy一維線(xiàn)性插值函數(shù)的用法

    Numpy一維線(xiàn)性插值函數(shù)的用法

    這篇文章主要介紹了Numpy一維線(xiàn)性插值函數(shù)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04

最新評(píng)論

玛曲县| 钟山县| 镇巴县| 万载县| 长岛县| 犍为县| 白水县| 潼关县| 美姑县| 民县| 安溪县| 内丘县| 循化| 房产| 罗甸县| 城固县| 那坡县| 东平县| 鹿泉市| 民勤县| 铅山县| 岢岚县| 揭西县| 庆元县| 泸定县| 苏尼特左旗| 木里| 天峨县| 股票| 合肥市| 龙门县| 洛川县| 德清县| 巨野县| 苍溪县| 平罗县| 长丰县| 唐河县| 普宁市| 喜德县| 华宁县|