最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

詳解PyTorch數(shù)據(jù)讀取機制Dataloader與Dataset

2023-05-05 13:33 作者:深度之眼官方賬號  | 我要投稿

來源:投稿 作者:阿克西

編輯:學姐

本章主要講述數(shù)據(jù)模塊,如何從硬盤中讀取數(shù)據(jù),對數(shù)據(jù)進行預處理、數(shù)據(jù)增強,轉換為張量的形式輸入到模型之中。

1.模塊簡介

本節(jié)主要學習數(shù)據(jù)模塊當中的數(shù)據(jù)讀取,數(shù)據(jù)模塊通常還會分為四個子模塊,數(shù)據(jù)收集、數(shù)據(jù)劃分、數(shù)據(jù)讀取、數(shù)據(jù)預處理。

● 數(shù)據(jù)收集:收集原始樣本和標簽,如Img和Label。

● 數(shù)據(jù)劃分:劃分成訓練集train,用來訓練模型;驗證集valid,驗證模型是否過擬合,挑選還沒有過擬合的時候的模型;測試集test,測試挑選出來的模型的性能。

● 數(shù)據(jù)讀?。篜yTorch中數(shù)據(jù)讀取的核心是Dataloader。Dataloader分為Sampler和DataSet兩個子模塊。Sampler的功能是生成索引,即樣本序號;DataSet的功能是根據(jù)索引讀取樣本和對應的標簽。

● 數(shù)據(jù)預處理:數(shù)據(jù)的中心和,標準化,旋轉,翻轉等,在PyTorch中是通過transforms實現(xiàn)的。

這里主要學習第三個子模塊中的Dataloader和Dataset。

2.DataLoader與Dataset

DataLoader和Dataset是pytorch中數(shù)據(jù)讀取的核心。

2.1 DataLoader

功能:構建可迭代的數(shù)據(jù)裝載器,每一次for循環(huán)就是從DataLoader中加載一個batchsize數(shù)據(jù)。

● dataset:Dataset類,決定數(shù)據(jù)從哪讀取及如何讀取

● batchsize:批大小

● num_works:是否多進程讀取數(shù)據(jù)

● shuffle:每個epoch是否亂序

● drop_last:當樣本數(shù)不能被batchsize整除時,是否舍棄最后一批數(shù)據(jù)

概念辨析:

● epoch:所有訓練樣本都已輸入到模型中,稱為一個epoch

● iteration:一批樣本輸入到模型中,稱之為一個iteration

● batchsize:批大小,決定一個epoch中有多少個iteration

樣本總數(shù):80,batchsize:8 (樣本能被batchsize整除)

● 1(epoch) = 10(iteration)

樣本總數(shù):87,batchsize=8 (樣本不能被batchsize整除)

● drop_last = True:1(epoch) = 10(iteration)

● drop_last = False:1(epoch)= 11(iteration)

2.2 Dataset

功能:Dataset抽象類,所有自定義的Dataset需要繼承它,并且必須復寫__getitem__()。

● Dataset:用來定義數(shù)據(jù)從哪里讀取,以及如何讀取的問題

● getitem:接收一個索引,返回一個樣本

3.人民幣二分類

要求:對第四套人民幣1元和10元進行二分類,將人民幣看作自變量x,類別看作因變量y,模型就是將自變量x映射到因變量y。

下面對人民幣二分類的數(shù)據(jù)進行讀取,從三個方面了解pytorch的讀取機制,分別為讀哪些數(shù)據(jù)、從哪讀數(shù)據(jù)、怎么讀數(shù)據(jù)。

讀哪些數(shù)據(jù):在每一個iteration的時候應該讀取哪些數(shù)據(jù),每一個iteration讀取一個batch大小的數(shù)據(jù),假如有80個樣本,那么從80個樣本中讀取8個樣本,那么應該讀取哪8個樣本。

從哪讀數(shù)據(jù) :在硬盤當中,我們應該怎么找到對應的數(shù)據(jù),在哪里設置參數(shù)。

怎么讀數(shù)據(jù) :從代碼中學習。

3.1 數(shù)據(jù)集劃分


劃分好的數(shù)據(jù)集:

3.2 人民幣分類模型訓練

3.2.1 導入包與參數(shù)設置

3.2.2 ??Dataset類參數(shù)一:從哪讀數(shù)據(jù),設置硬盤中的路徑

3.2.3 ??Dataset類參數(shù)二:數(shù)據(jù)預處理transform

transforms.Compose將一系列數(shù)據(jù)增強方法進行有序的組合,依次按照順序對圖像進行處理。

3.2.4 ??構建Dataset實例

Dataset必須是用戶自己構建的,在Dataset中會傳入兩個主要參數(shù),一個是data_dir,表示數(shù)據(jù)集的路徑,即從哪讀數(shù)據(jù);第二個參數(shù)是transform,表示數(shù)據(jù)預處理。代碼中構建了兩個Dataset實例,一個用于訓練,一個用于驗證。

3.2.5 ??構建DataLoader實例

有了Dataset就可以構建數(shù)據(jù)迭代器DataLoader,DataLoader傳入的第一個參數(shù)是Dataset,也就是RMBDataset實例;第二個參數(shù)是batch_size;在訓練集中的多了一個參數(shù)shuffle=True,作用是每一個epoch中樣本都是亂序的。

3.2.6 模型、損失函數(shù)、優(yōu)化器

3.2.7 開始訓練

設置好數(shù)據(jù)、模型、損失函數(shù)和優(yōu)化器之后,就可以進行模型的訓練。

模型訓練以epoch為周期,代碼中先進行epoch的主循環(huán),在每一個epoch當中會有多個iteration的訓練,在每一個iteration當中去訓練模型,每一次讀取一個batch_size大小的數(shù)據(jù),然后輸入到模型中,進行前向傳播,反向傳播獲取梯度,更新權值,接著統(tǒng)計分類準確率,打印訓練信息。在每一個epoch會進行驗證集的測試,通過驗證集來觀察模型是否過擬合。

輸出結果

3.3 RMBDataset類

3.4 斷點調(diào)試

現(xiàn)在了解一下上面代碼中RMBDataset中的具體實現(xiàn)。

pycharm小技巧:按住Ctrl,然后單擊函數(shù)名或者類名就可以跳轉到具體函數(shù)實現(xiàn)的位置。

在訓練模型時,數(shù)據(jù)的獲取是通過for循環(huán)獲取的,從DataLoader迭代器中不停地去獲取一個batchsize大小的數(shù)據(jù)。

1、下面通過代碼的調(diào)試觀察pytorch是如何讀取數(shù)據(jù)的,在該處設置斷點,然后執(zhí)行debug。

點擊step into功能鍵,跳轉到對應的函數(shù)中,發(fā)現(xiàn)是跳到了dataloader.py文件中的__iter__()函數(shù);具體如下所示:

這段代碼是一個if的判斷語句,其功能是判斷是否采用多進程;如果采用多進程,有多進程的讀取機制;如果是單進程,有單進程的讀取機制;這里以單進程進行演示。

2、單擊兩次step into功能鍵

單進程當中,最主要的是__next__()函數(shù),在next中會獲取index和data,回想一下數(shù)據(jù)讀取中的三個問題,第一個問題是讀哪些數(shù)據(jù);__next__()函數(shù)就告訴我們,在每一個iteration當中讀取哪些數(shù)據(jù)。

現(xiàn)在將光標對準_next_data函數(shù)中的第一行index=self._next_index(),點擊功能區(qū)中的run to cursor,然后程序就會運行到這一行,點擊功能區(qū)中的step into,進入到_next_index()函數(shù)中了解是怎么獲得數(shù)據(jù)的index的;之后代碼會跳到下面的代碼中:

再點擊一下step into就進入了sampler.py文件中,sampler是一個采樣器,其功能是告訴我們每一個batch_size應該讀取哪些數(shù)據(jù);

點擊兩次step out功能鍵

點擊step over功能鍵,執(zhí)行上面這段代碼中的:

就可以挑選出一個Iteration中的index,batch_size的值是16,則index列表長度為16:

有了index之后,將index輸入到Dataset當中去獲取data,代碼中會進入dataset_fetcher.fetch()函數(shù)。

3、點擊功能區(qū)中的step_into,進入到fetch.py文件的_MapDatasetFetcher()類當中,在這個類里面實現(xiàn)了具體的數(shù)據(jù)讀取,具體代碼如下。代碼中調(diào)用了dataset,通過輸入一個索引idx返回一個data,將一系列的data拼接成一個list。

點擊step into查看一下這個過程,代碼跳轉到自定義dataset類RMBdataset()中的__getitem__()函數(shù)中,所以dataset最重要最核心的就是__getitem__()函數(shù);

這里已經(jīng)實現(xiàn)了data_info()函數(shù),對數(shù)據(jù)進行初步的讀取,可以得到圖片的路徑和標簽;然后通過Image.open來讀取數(shù)據(jù),這就實現(xiàn)了一個數(shù)據(jù)的讀取,標簽的獲取。

之后點擊step_out跳出該函數(shù),會返回fetch()函數(shù)中;

在fetch()函數(shù)return的時候會進入一個collate_fn(),它是數(shù)據(jù)的整理器,會將我們讀取到的16個數(shù)據(jù)整理出一個batch的形式;得到數(shù)據(jù)和標簽。

將光標放在return self.collate_fn(data) 處,點擊run to cursor執(zhí)行到當前位置,之后點擊step over返回到單進程,點擊step over,執(zhí)行到下述代碼,發(fā)現(xiàn)data已被打包,第一個元素是圖像,第二個元素是標簽。

點擊多次step out返回到最初訓練模型讀取數(shù)據(jù)的位置,執(zhí)行step over可以發(fā)現(xiàn)循環(huán)中的data已被打包,第一個元素是圖像,第二個元素是標簽。

3.5 總結

通過以上的分析,可以回答一開始提出的數(shù)據(jù)讀取的三個問題:

1、讀哪些數(shù)據(jù)?

答:從代碼中可以發(fā)現(xiàn),index是從sampler.py中輸出的,所以讀哪些數(shù)據(jù)是由sampler得到的;

2、從哪讀數(shù)據(jù)?

答:從代碼中看,是從Dataset中的參數(shù)data_dir告訴我們pytorch是從硬盤中的哪一個文件夾獲取數(shù)據(jù)。

3、怎么讀數(shù)據(jù)?

答:從代碼中可以發(fā)現(xiàn),pytorch是從Dataset的getitem()中具體實現(xiàn)的,根據(jù)索引去讀取數(shù)據(jù)。

Dataloader讀取數(shù)據(jù)很復雜,需要經(jīng)過四五個函數(shù)的跳轉才能最終讀取數(shù)據(jù)

為了簡單,將整個跳轉過程以流程圖進行表示,通過流程圖對數(shù)據(jù)讀取機制有一個簡單的認識。

簡單描述一下流程圖:

  1. 首先在for循環(huán)中去使用DataLoader;

  2. 進入DataLoader之后是否采用多進程進入單進程或者多進程的DataLoaderlter;

  3. 進入DataLoaderIter之后會使用sampler去獲取Index;

  4. 拿到索引之后傳輸?shù)紻atasetFetcher;

  5. 在DatasetFetcher中會調(diào)用Dataset,Dataset根據(jù)給定的Index,在getitem中從硬盤里面去讀取實際的Img和Label;

  6. 讀取了一個batch_size的數(shù)據(jù)之后,通過一個collate_fn將數(shù)據(jù)進行整理;

  7. 整理成batch_Data的形式,接著就可以輸入到模型中訓練。

讀哪些是由Sampler決定的index,從哪讀是由Dataset決定的,怎么讀是由getitem決定的。

關注【學姐帶你玩AI】公眾號

回復“500”免費領取200多篇精選AI必讀論文!

詳解PyTorch數(shù)據(jù)讀取機制Dataloader與Dataset的評論 (共 條)

分享到微博請遵守國家法律
济源市| 社旗县| 忻州市| 普兰店市| 高碑店市| 建阳市| 九龙城区| 随州市| 海安县| 梓潼县| 荃湾区| 修武县| 新田县| 玉龙| 苏尼特右旗| 左贡县| 肥西县| 遂平县| 玛纳斯县| 鲜城| 乌兰县| 高雄市| 明溪县| 盘锦市| 枣强县| 英吉沙县| 紫云| 娱乐| 大化| 宝鸡市| 万年县| 宝应县| 永清县| 迁安市| 蓬溪县| 新乐市| 罗定市| 鄂托克前旗| 山西省| 深州市| 剑川县|