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

pytorch?collate_fn的基礎與應用教程

 更新時間:2022年02月10日 11:07:32   作者:音程  
這篇文章主要給大家介紹了關于pytorch?collate_fn基礎與應用的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

作用

collate_fn:即用于collate的function,用于整理數(shù)據(jù)的函數(shù)。

說到整理數(shù)據(jù),你當然要會用數(shù)據(jù),即會用數(shù)據(jù)制作工具torch.utils.data.Dataset,雖然我們今天談的是torch.utils.data.DataLoader,但是,其實:

  1. 這兩個你如何定義;
  2. 從裝載器dataloader中取數(shù)據(jù)后做什么處理;
  3. 模型的forward()中如何處理。

這三部分都是有機統(tǒng)一而不可分割的,一個地方改了,其他地方就要改。

emmm…,小小總結,collate_fn籠統(tǒng)的說就是用于整理數(shù)據(jù),通常我們不需要使用,其應用的情形是:各個數(shù)據(jù)長度不一樣的情況,比如第一張圖片大小是28*28,第二張是50*50,這樣的話就如果不自己寫collate_fn,而使用默認的,就會報錯。

原則

其實說起來,我們也沒有什么原則,但是如今大多數(shù)做深度學習都是使用GPU,所以這個時候我們需要記住一個總則:只有tensor數(shù)據(jù)類型才能運行在GPU上,list和numpy都不可以。

從而,我們什么時候?qū)⑽覀兊臄?shù)據(jù)轉化為tensor是一個問題,我的答案是前一節(jié)中的三個部分都可以來轉化,只是我們大多數(shù)的人都習慣在部分一轉化。

基礎

dataset

我們必須先看看torch.utils.data.Dataset如何使用,以一個例子為例:

import torch.utils.data as Data
class mydataset(Data.Dataset):
    def __init__(self,train_inputs,train_targets):#必須有
        super(mydataset,self).__init__()
        self.inputs=train_inputs
        self.targets=train_targets
        
    def __getitem__(self, index):#必須重寫
        return self.inputs[index],self.targets[index]
        
    def __len__(self):#必須重寫
        return len(self.targets)
#構造訓練數(shù)據(jù)
datax=torch.randn(4,3)#構造4個輸入
datay=torch.empty(4).random_(2)#構造4個標簽
#制作dataset
dataset=mydataset(datax,datay)

下面,可以對dataset進行一系列操作,這些操作返回的結果和你之前那個class的三個函數(shù)定義都息息相關。我想說,那三個函數(shù)非常自由,你想怎么定義就怎么定義,上述只是一種常見的而已,你可以定制一個特色的。

len(dataset)#調(diào)用了你上面定義的def __len__()那個函數(shù)
#4
dataset[0]#調(diào)用了你上面定義的def __getitem__()那個函數(shù)
#(tensor([-1.1426, -1.3239,  1.8372]), tensor(0.))

所以我再三強調(diào)的是上面的輸出結果和你的定義有關,比如你完全可以把def __getitem__()改成:

    def __getitem__(self, index):
        return self.inputs[index]#不輸出標簽

那么,

dataset[0]#此時當然變化。
#tensor([-1.1426, -1.3239,  1.8372])

可以看到,是非常隨便的,你隨便定制就好。

dataloader

torch.utils.data.DataLoader

dataloader=Data.DataLoader(dataset,batch_size=2)

4個數(shù)據(jù),batch_size=2,所以一共有2個batch。

collate_fn如果你不指定,會調(diào)用pytorch內(nèi)部的,也就是說這個函數(shù)是一定會調(diào)用的,而且調(diào)用這個函數(shù)時pytorch會往這個函數(shù)里面?zhèn)魅胍粋€參數(shù)batch。

def my_collate(batch):
	return xxx

這個batch是什么?這個東西和你定義的dataset, batch_size息息相關。batch是一個列表[x,...,xx],長度就是batch_size,里面每一個元素是dataset的某一個元素,即dataset[i](我在上一節(jié)展示過dataset[0])。

在我們的例子中,由于我們沒有對dataloader設置需要打亂數(shù)據(jù),即shuffle=True,那么第1個batch就是前兩個數(shù)據(jù),如下:

print(datax)
print(datay)
batch=[dataset[0],dataset[1]]#所以才說和你dataset中get_item的定義有關。
print(batch)

對,你沒有看錯,上述代碼展示的batch就會傳入到pytorch默認的collate_fn中,然后經(jīng)過默認的處理,輸出如下:

it=iter(dataloader)
nex=next(it)#我們展示第一個batch經(jīng)過collate_fn之后的輸出結果
print(nex)

其實,上面就是我們常用的,經(jīng)典的輸出結果,即輸入和標簽是分開的,第一項是輸入tensor,第二項是標簽tensor,輸入的維度變成了(batch_size,input_size)。

但是我們乍一看,將第一個batch變成上述輸出結果很容易呀,我們也會!我們下面就來自己寫一個collate_fn實現(xiàn)這個功能。

# a simple custom collate function, just to show the idea
# `batch` is a list of tuple where first element is input tensor and the second element is corresponding label
def my_collate(batch):
    inputs=[data[0].tolist() for data in batch]
    target = torch.tensor([data[1] for data in batch])
    return [data, target]

 

dataloader=Data.DataLoader(dataset,batch_size=2,collate_fn=my_collate)
print(datax)
print(datay)

it=iter(dataloader)
nex=next(it)
print(nex)

這不就和默認的collate_fn的輸出結果一樣了嘛!無非就是默認的還把輸入變成了tensor,標簽變成了tensor,我上面是列表,我改就是了嘛!如下:

def my_collate(batch):
    inputs=[data[0].tolist() for data in batch]
    inputs=torch.tensor(inputs)
    target =[data[1].tolist() for data in batch]
    target=torch.tensor(target)
    return [inputs, target]
    
dataloader=Data.DataLoader(dataset,batch_size=2,collate_fn=my_collate)
it=iter(dataloader)
nex=next(it)
print(nex)

這下好了吧!

對了,作為彩蛋,告訴大家一個秘密:默認的collate_fn函數(shù)中有一些語句是轉tensor以及tensor合并的操作,所以你的dataset如果沒有設計成經(jīng)典模式的話,使用默認的就容易報錯,而我們自己會寫collate_fn,當然就不存在這個問題啦。同時,給大家的一個經(jīng)驗就是,一般dataset是不會報錯的,而是根據(jù)dataset制作dataloader的時候容易報錯,因為默認collate_fn把dataset的類型限制得比較死。

應用情形

假設我們還是4個輸入,但是維度不固定的。

a=[[1,2],[3,4,5],[1],[3,4,9]]
b=[1,0,0,1]
dataset=mydataset(a,b)
dataloader=Data.DataLoader(dataset,batch_size=2)
it=iter(dataloader)
nex=next(it)
nex

使用默認的collate_fn,直接報錯,要求相同維度。

這個時候,我們可以使用自己的collate_fn,避免報錯。

不過話說回來,我個人感受是:

在這里避免報錯好像也沒有什么用,因為大多數(shù)的神經(jīng)網(wǎng)絡都是定長輸入的,而且很多的操作也要求相同維度才能相加或相乘,所以:這里不報錯,后面還是報錯。如果后面解決這個問題的方法是:在不足維度上進行補0操作,那么我們?yōu)槭裁床辉诮ataset之前先補好呢?所以,collate_fn這個東西的應用場景還是有限的。

總結

到此這篇關于pytorch collate_fn的基礎與應用的文章就介紹到這了,更多相關pytorch collate_fn應用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解如何用Python模擬登錄淘寶

    詳解如何用Python模擬登錄淘寶

    最近想爬取淘寶的一些商品,但是發(fā)現(xiàn)如果要使用搜索等一些功能時基本都需要登錄,所以就想出一篇模擬登錄淘寶的文章!本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • python3實現(xiàn)點餐系統(tǒng)

    python3實現(xiàn)點餐系統(tǒng)

    這篇文章主要為大家詳細介紹了python3實現(xiàn)點餐系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Numpy之reshape()使用詳解

    Numpy之reshape()使用詳解

    今天小編就為大家分享一篇Numpy之reshape()使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • PyTorch使用GPU訓練的兩種方法實例

    PyTorch使用GPU訓練的兩種方法實例

    pytorch是一個非常優(yōu)秀的深度學習的框架,具有速度快,代碼簡潔,可讀性強的優(yōu)點,下面這篇文章主要給大家介紹了關于PyTorch使用GPU訓練的兩種方法,需要的朋友可以參考下
    2022-05-05
  • 表格梳理解析python內(nèi)置時間模塊看完就懂

    表格梳理解析python內(nèi)置時間模塊看完就懂

    這篇文章主要介紹了python內(nèi)置的時間模塊,本文用表格方式清晰的對Python內(nèi)置時間模塊進行語法及用法的梳理解析,有需要的朋友建議收藏參考
    2021-10-10
  • 利用Python實現(xiàn)自定義連點器

    利用Python實現(xiàn)自定義連點器

    這篇文章主要介紹了如何利用Python實現(xiàn)自定義連點器,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Python曲線擬合詳解

    Python曲線擬合詳解

    這篇文章主要介紹了關于python曲線擬合,scipy.optimize中,curve_fit函數(shù)可調(diào)用非線性最小二乘法進行函數(shù)擬合,文中有詳細的代碼作為參考,需要的朋友可以閱讀參考
    2023-04-04
  • 基于tf.shape(tensor)和tensor.shape()的區(qū)別說明

    基于tf.shape(tensor)和tensor.shape()的區(qū)別說明

    這篇文章主要介紹了基于tf.shape(tensor)和tensor.shape()的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 對Keras中predict()方法和predict_classes()方法的區(qū)別說明

    對Keras中predict()方法和predict_classes()方法的區(qū)別說明

    這篇文章主要介紹了對Keras中predict()方法和predict_classes()方法的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 跟老齊學Python之大話題小函數(shù)(2)

    跟老齊學Python之大話題小函數(shù)(2)

    上篇文章我們講訴了map 和lambda函數(shù)的使用,本文我們繼續(xù)來看看reduce和filter函數(shù),有需要的朋友可以參考下
    2014-10-10

最新評論