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

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

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

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

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 對象,它擁有許多熟悉,我們可以通過以下方法獲取樣本數(shù)據(jù)的分類類別集合、樣本的特征維度、樣本的標簽集合等信息。

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

但是,我們常常會在訓(xùn)練集的基礎(chǔ)上拆分出驗證集(或者只用部分數(shù)據(jù)來進行訓(xùn)練)。我們想到的第一個方法是使用 torch.utils.data.random_splitdataset 進行劃分,下面我們假設(shè)劃分10000個樣本做為訓(xù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 對象,而是一個所謂的 Subset 對象!此時 Subset 對象雖然仍然還存有 data 屬性,但是內(nèi)置的 target classes 屬性已經(jīng)不復(fù)存在,

比如如果我們強行訪問 valid_data 的 target 屬性:

valid_target = valid_data.target

就會報如下錯誤:

'Subset' object has no attribute 'target'

但如果我們在后續(xù)的代碼中常常會將拆分后的數(shù)據(jù)集也默認為 dataset 對象,那么該如何做到代碼的一致性呢?

這里有一個trick,那就是以繼承 SubSet 類的方式的方式定義一個新的 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): #同時支持索引訪問操作
? ? ? ? x, y = self.dataset[self.indices[idx]] ? ? ?
? ? ? ? return x, y?

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

然后就引出了第二種劃分方法,即通過初始化 CustomSubset 對象的方式直接對數(shù)據(jù)集進行劃分(這里為了簡化省略了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 類的初始化方法的第二個參數(shù) indices 為樣本索引,我們可以通過 np.arange() 的方法來創(chuàng)建。

然后,我們再訪問 valid_data 對應(yīng)的 classes 和 targes 屬性:

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

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

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

當然, 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))])

這樣,我們再像下列這樣用索引訪問取出數(shù)據(jù)集樣本時,就會自動調(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django實現(xiàn)單用戶登錄的方法示例

    Django實現(xiàn)單用戶登錄的方法示例

    這篇文章主要介紹了Django實現(xiàn)單用戶登錄的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • python?slack桌面自動化開發(fā)工具

    python?slack桌面自動化開發(fā)工具

    這篇文章主要為大家介紹了python?slack桌面自動化開發(fā)工具使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Python利用Diagrams繪制漂亮的系統(tǒng)架構(gòu)圖

    Python利用Diagrams繪制漂亮的系統(tǒng)架構(gòu)圖

    Diagrams  是一個基于Python繪制云系統(tǒng)架構(gòu)的模塊,它能夠通過非常簡單的描述就能可視化架構(gòu)。本文將利用它繪制漂亮的系統(tǒng)架構(gòu)圖,感興趣的可以了解一下
    2023-01-01
  • python 寫的一個爬蟲程序源碼

    python 寫的一個爬蟲程序源碼

    這篇文章主要介紹了python 寫的一個爬蟲程序源碼,需要的朋友可以參考下
    2016-02-02
  • Python?獲取指定開頭指定結(jié)尾所夾中間內(nèi)容(推薦)

    Python?獲取指定開頭指定結(jié)尾所夾中間內(nèi)容(推薦)

    獲取文章中指定開頭、指定結(jié)尾中所夾的內(nèi)容。其中,開頭和結(jié)尾均有多種,但最多也就十幾種,所以代碼還是具有可行性的,今天小編給大家介紹通過Python?獲取指定開頭指定結(jié)尾所夾中間內(nèi)容,感興趣的朋友一起看看吧
    2023-02-02
  • Python中支持向量機SVM的使用方法詳解

    Python中支持向量機SVM的使用方法詳解

    這篇文章主要為大家詳細介紹了Python中支持向量機SVM的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • python  fire庫的使用實例教程

    python  fire庫的使用實例教程

    fire是python中用于生成命令行界面(Command Line Interfaces, CLIs)的工具,不需要做任何額外的工作,只需要從主模塊中調(diào)用fire.Fire(),它會自動將你的代碼轉(zhuǎn)化為CLI,F(xiàn)ire()的參數(shù)可以說任何的python對象,對python fire庫使用感興趣的朋友一起看看吧
    2022-12-12
  • python開發(fā)之for循環(huán)操作實例詳解

    python開發(fā)之for循環(huán)操作實例詳解

    這篇文章主要介紹了python開發(fā)之for循環(huán)操作,以實例形式較為詳細的分析了Python中for循環(huán)的具體使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • tensorflow模型繼續(xù)訓(xùn)練 fineturn實例

    tensorflow模型繼續(xù)訓(xùn)練 fineturn實例

    今天小編就為大家分享一篇tensorflow模型繼續(xù)訓(xùn)練 fineturn實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python面向?qū)ο罂偨Y(jié)及類與正則表達式詳解

    Python面向?qū)ο罂偨Y(jié)及類與正則表達式詳解

    Python中的類提供了面向?qū)ο缶幊痰乃谢竟δ埽侯惖睦^承機制允許多個基類,派生類可以覆蓋基類中的任何方法,方法中可以調(diào)用基類中的同名方法。這篇文章主要介紹了Python面向?qū)ο罂偨Y(jié)及類與正則表達式 ,需要的朋友可以參考下
    2019-04-04

最新評論

扶绥县| 乌拉特后旗| 通海县| 武鸣县| 阿图什市| 五台县| 杭锦旗| 霸州市| 五峰| 和顺县| 沙河市| 岚皋县| 安康市| 东莞市| 内乡县| 拜泉县| 西宁市| 雅江县| 云和县| 彰武县| 闻喜县| 大竹县| 海宁市| 张家港市| 宜兴市| 沙洋县| 本溪市| 德保县| 如皋市| 潼关县| 乐安县| 临海市| 五家渠市| 阿拉尔市| 湄潭县| 满城县| 大悟县| 桐梓县| 南皮县| 安吉县| 平顶山市|