欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Pytorch技法之繼承Subset類完成自定義數(shù)據(jù)拆分

 更新時(shí)間:2022年02月20日 16:36:52   作者:Orion's?Blog  
這篇文章主要介紹了Pytorch技法之繼承Subset類完成自定義數(shù)據(jù)拆分,下文我們介紹一些下面是加載內(nèi)置訓(xùn)練數(shù)據(jù)集的常見(jiàn)操作,需要的小伙伴可以參考一下

我們?cè)?《torch.utils.data.DataLoader與迭代器轉(zhuǎn)換操作》 中介紹了如何使用Pytorch內(nèi)置的數(shù)據(jù)集進(jìn)行論文實(shí)驗(yàn),如 torchvision.datasets 。下面是加載內(nèi)置訓(xùn)練數(shù)據(jù)集的常見(jiàn)操作:

from torchvision.datasets import FashionMNIST
from torchvision.transforms import Compose, ToTensor, Normalize
RAW_DATA_PATH = './rawdata'
transform = Compose(
? ? ? ? [ToTensor(),
? ? ? ? ?Normalize((0.1307,), (0.3081,))
? ? ? ? ?]
? ? )
train_data = FashionMNIST(
? ? ? ? root=RAW_DATA_PATH,
? ? ? ? download=True,
? ? ? ? train=True,
? ? ? ? transform=transform
? ? )

這里的train_data 做為 dataset 對(duì)象,它擁有許多熟悉,我們可以通過(guò)以下方法獲取樣本數(shù)據(jù)的分類類別集合、樣本的特征維度、樣本的標(biāo)簽集合等信息。

classes = train_data.classes
num_features = train_data.data[0].shape[0]
train_labels = train_data.targets

print(classes)
print(num_features)
print(train_labels)

輸出如下:

['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
28
tensor([9, 0, 0,  ..., 3, 0, 5])

但是,我們常常會(huì)在訓(xùn)練集的基礎(chǔ)上拆分出驗(yàn)證集(或者只用部分?jǐn)?shù)據(jù)來(lái)進(jìn)行訓(xùn)練)。我們想到的第一個(gè)方法是使用 torch.utils.data.random_split 對(duì) dataset 進(jìn)行劃分,下面我們假設(shè)劃分10000個(gè)樣本做為訓(xùn)練集,其余樣本做為驗(yàn)證集:

from torch.utils.data import random_split
k = 10000
train_data, valid_data = random_split(train_data, [k, len(train_data)-k])

注意我們?nèi)绻蛴?train_data 和 valid_data 的類型,可以看到顯示:

<class 'torch.utils.data.dataset.Subset'>

已經(jīng)不再是torchvision.datasets.mnist.FashionMNIST 對(duì)象,而是一個(gè)所謂的 Subset 對(duì)象!此時(shí) Subset 對(duì)象雖然仍然還存有 data 屬性,但是內(nèi)置的 target classes 屬性已經(jīng)不復(fù)存在,

比如如果我們強(qiáng)行訪問(wèn) valid_data 的 target 屬性:

valid_target = valid_data.target

就會(huì)報(bào)如下錯(cuò)誤:

'Subset' object has no attribute 'target'

但如果我們?cè)诤罄m(xù)的代碼中常常會(huì)將拆分后的數(shù)據(jù)集也默認(rèn)為 dataset 對(duì)象,那么該如何做到代碼的一致性呢?

這里有一個(gè)trick,那就是以繼承 SubSet 類的方式的方式定義一個(gè)新的 CustomSubSet 類,使新類在保持 SubSet 類的基本屬性的基礎(chǔ)上,擁有和原本數(shù)據(jù)集類相似的屬性,如 targets classes 等:

from torch.utils.data import Subset
class CustomSubset(Subset):
? ? '''A custom subset class'''
? ? def __init__(self, dataset, indices):
? ? ? ? super().__init__(dataset, indices)
? ? ? ? self.targets = dataset.targets # 保留targets屬性
? ? ? ? self.classes = dataset.classes # 保留classes屬性

? ? def __getitem__(self, idx): #同時(shí)支持索引訪問(wèn)操作
? ? ? ? x, y = self.dataset[self.indices[idx]] ? ? ?
? ? ? ? return x, y?

? ? def __len__(self): # 同時(shí)支持取長(zhǎng)度操作
? ? ? ? return len(self.indices)

然后就引出了第二種劃分方法,即通過(guò)初始化 CustomSubset 對(duì)象的方式直接對(duì)數(shù)據(jù)集進(jìn)行劃分(這里為了簡(jiǎn)化省略了shuffle的步驟):

import numpy as np
from copy import deepcopy
origin_data = deepcopy(train_data)
train_data = CustomSubset(origin_data, np.arange(k))
valid_data = CustomSubset(origin_data, np.arange(k, len(origin_data))-k)

注意: CustomSubset 類的初始化方法的第二個(gè)參數(shù) indices 為樣本索引,我們可以通過(guò) np.arange() 的方法來(lái)創(chuàng)建。

然后,我們?cè)僭L問(wèn) valid_data 對(duì)應(yīng)的 classes 和 targes 屬性:

print(valid_data.classes)
print(valid_data.targets)

此時(shí),我們發(fā)現(xiàn)可以成功訪問(wèn)這些屬性了:

['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
tensor([9, 0, 0, ?..., 3, 0, 5])

當(dāng)然, CustomSubset 的作用并不只是添加數(shù)據(jù)集的屬性,我們還可以自定義一些數(shù)據(jù)預(yù)處理操作。

我們將類的結(jié)構(gòu)修改如下:

class CustomSubset(Subset):
? ? '''A custom subset class with customizable data transformation'''
? ? def __init__(self, dataset, indices, subset_transform=None):
? ? ? ? super().__init__(dataset, indices)
? ? ? ? self.targets = dataset.targets
? ? ? ? self.classes = dataset.classes
? ? ? ? self.subset_transform = subset_transform

? ? def __getitem__(self, idx):
? ? ? ? x, y = self.dataset[self.indices[idx]]
? ? ? ??
? ? ? ? if self.subset_transform:
? ? ? ? ? ? x = self.subset_transform(x)
? ? ??
? ? ? ? return x, y ??
? ??
? ? def __len__(self):?
? ? ? ? return len(self.indices)

我們可以在使用樣本前設(shè)置好數(shù)據(jù)預(yù)處理算子:

from torchvision import transforms
valid_data.subset_transform = transforms.Compose(\
? ? [transforms.RandomRotation((180,180))])

這樣,我們?cè)傧裣铝羞@樣用索引訪問(wèn)取出數(shù)據(jù)集樣本時(shí),就會(huì)自動(dòng)調(diào)用算子完成預(yù)處理操作:

print(valid_data[0])

打印結(jié)果縮略如下:

(tensor([[[-0.4242, -0.4242, -0.4242, ......-0.4242, -0.4242, -0.4242, -0.4242, -0.4242]]]), 9)

 到此這篇關(guān)于Pytorch技法之繼承Subset類完成自定義數(shù)據(jù)拆分的文章就介紹到這了,更多相關(guān)繼承Subset類完成自定義數(shù)據(jù)拆分內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python內(nèi)存管理方式和垃圾回收算法解析

    Python內(nèi)存管理方式和垃圾回收算法解析

    這篇文章主要介紹了Python內(nèi)存管理方式和垃圾回收算法解析,介紹了傳統(tǒng)的垃圾回收機(jī)制,其工作方法,finalizer的問(wèn)題等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Python隊(duì)列Queue超詳細(xì)講解

    Python隊(duì)列Queue超詳細(xì)講解

    Queue是python標(biāo)準(zhǔn)庫(kù)中的線程安全的隊(duì)列(FIFO)實(shí)現(xiàn),提供了一個(gè)適用于多線程編程的先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),即隊(duì)列,用來(lái)在生產(chǎn)者和消費(fèi)者線程之間的信息傳遞,本文給大家講解Python隊(duì)列Queue的相關(guān)知識(shí),需要的朋友參考下吧
    2023-04-04
  • 使用Python實(shí)現(xiàn)數(shù)據(jù)重采樣的示例代碼

    使用Python實(shí)現(xiàn)數(shù)據(jù)重采樣的示例代碼

    數(shù)據(jù)重采樣是一種用于調(diào)整數(shù)據(jù)集大小或分布的技術(shù),它涉及通過(guò)增加或減少數(shù)據(jù)點(diǎn)的數(shù)量來(lái)修改現(xiàn)有數(shù)據(jù)集,下面我們就來(lái)學(xué)習(xí)一下如何利用Python實(shí)現(xiàn)數(shù)據(jù)重采樣吧
    2023-11-11
  • python 實(shí)現(xiàn)批量圖片識(shí)別并翻譯

    python 實(shí)現(xiàn)批量圖片識(shí)別并翻譯

    這篇文章主要介紹了python 實(shí)現(xiàn)批量圖片識(shí)別并翻譯,幫助大家利用python處理圖片,感興趣的朋友可以了解下
    2020-11-11
  • Python爬蟲(chóng)框架scrapy實(shí)現(xiàn)downloader_middleware設(shè)置proxy代理功能示例

    Python爬蟲(chóng)框架scrapy實(shí)現(xiàn)downloader_middleware設(shè)置proxy代理功能示例

    這篇文章主要介紹了Python爬蟲(chóng)框架scrapy實(shí)現(xiàn)downloader_middleware設(shè)置proxy代理功能,結(jié)合實(shí)例形式分析了scrapy框架proxy代理設(shè)置技巧與相關(guān)問(wèn)題注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • 詳解python tkinter模塊安裝過(guò)程

    詳解python tkinter模塊安裝過(guò)程

    tkinter其實(shí)是Python調(diào)用tcl程序的標(biāo)準(zhǔn)Python程序,可以通過(guò)這個(gè)interface調(diào)用tcl的程序,因?yàn)樵诖蠖鄶?shù)的unix系統(tǒng)中都內(nèi)置了很多的tcl程序和命令。這篇文章主要介紹了python tkinter模塊安裝,需要的朋友可以參考下
    2020-01-01
  • Python中tkinter的用戶登錄管理的實(shí)現(xiàn)

    Python中tkinter的用戶登錄管理的實(shí)現(xiàn)

    這篇文章主要介紹了Python中tkinter的用戶登錄管理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Python序列化基礎(chǔ)知識(shí)(json/pickle)

    Python序列化基礎(chǔ)知識(shí)(json/pickle)

    這篇文章主要為大家詳細(xì)介紹了Python序列化json和pickle基礎(chǔ)知識(shí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Python實(shí)現(xiàn)日期判斷和加減操作詳解

    Python實(shí)現(xiàn)日期判斷和加減操作詳解

    這篇文章主要介紹了如何利用Python實(shí)現(xiàn)日期的判斷,以及對(duì)日期的加減操作,文中的示例代碼對(duì)我們學(xué)習(xí)或工作有一定的價(jià)值,需要的可以參考一下
    2022-01-01
  • python學(xué)習(xí)之新式類和舊式類講解

    python學(xué)習(xí)之新式類和舊式類講解

    這篇文章主要介紹了python 新式類和舊式類,文中比較詳細(xì)的介紹了相關(guān)內(nèi)容,有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評(píng)論