<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
collate_fn:即用於collate的function,用於整理資料的函數。
說到整理資料,你當然要會用資料,即會用資料製作工具torch.utils.data.Dataset
,雖然我們今天談的是torch.utils.data.DataLoader
,但是,其實:
這三部分都是有機統一而不可分割的,一個地方改了,其他地方就要改。
emmm…,小小總結,collate_fn籠統的說就是用於整理資料,通常我們不需要使用,其應用的情形是:各個資料長度不一樣的情況,比如第一張圖片大小是28*28,第二張是50*50,這樣的話就如果不自己寫collate_fn,而使用預設的,就會報錯。
其實說起來,我們也沒有什麼原則,但是如今大多數做深度學習都是使用GPU,所以這個時候我們需要記住一個總則:只有tensor資料型別才能執行在GPU上,list和numpy都不可以。
從而,我們什麼時候將我們的資料轉化為tensor是一個問題,我的答案是前一節中的三個部分都可以來轉化,只是我們大多數的人都習慣在部分一轉化。
我們必須先看看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)
#構造訓練資料 datax=torch.randn(4,3)#構造4個輸入 datay=torch.empty(4).random_(2)#構造4個標籤
#製作dataset dataset=mydataset(datax,datay)
下面,可以對dataset進行一系列操作,這些操作返回的結果和你之前那個class的三個函數定義都息息相關。我想說,那三個函數非常自由,你想怎麼定義就怎麼定義,上述只是一種常見的而已,你可以客製化一個特色的。
len(dataset)#呼叫了你上面定義的def __len__()那個函數 #4
dataset[0]#呼叫了你上面定義的def __getitem__()那個函數 #(tensor([-1.1426, -1.3239, 1.8372]), tensor(0.))
所以我再三強調的是上面的輸出結果和你的定義有關,比如你完全可以把def __getitem__()改成:
def __getitem__(self, index): return self.inputs[index]#不輸出標籤
那麼,
dataset[0]#此時當然變化。 #tensor([-1.1426, -1.3239, 1.8372])
可以看到,是非常隨便的,你隨便客製化就好。
torch.utils.data.DataLoader
dataloader=Data.DataLoader(dataset,batch_size=2)
4個資料,batch_size=2,所以一共有2個batch。
collate_fn如果你不指定,會呼叫pytorch內部的,也就是說這個函數是一定會呼叫的,而且呼叫這個函數時pytorch會往這個函數裡面傳入一個引數batch。
def my_collate(batch): return xxx
這個batch是什麼?這個東西和你定義的dataset, batch_size息息相關。batch是一個列表[x,...,xx],長度就是batch_size,裡面每一個元素是dataset的某一個元素,即dataset[i](我在上一節展示過dataset[0])。
在我們的例子中,由於我們沒有對dataloader設定需要打亂資料,即shuffle=True,那麼第1個batch就是前兩個資料,如下:
print(datax) print(datay) batch=[dataset[0],dataset[1]]#所以才說和你dataset中get_item的定義有關。 print(batch)
對,你沒有看錯,上述程式碼展示的batch就會傳入到pytorch預設的collate_fn中,然後經過預設的處理,輸出如下:
it=iter(dataloader) nex=next(it)#我們展示第一個batch經過collate_fn之後的輸出結果 print(nex)
其實,上面就是我們常用的,經典的輸出結果,即輸入和標籤是分開的,第一項是輸入tensor,第二項是標籤tensor,輸入的維度變成了(batch_size,input_size)。
但是我們乍一看,將第一個batch變成上述輸出結果很容易呀,我們也會!我們下面就來自己寫一個collate_fn實現這個功能。
# 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函數中有一些語句是轉tensor以及tensor合併的操作,所以你的dataset如果沒有設計成經典模式的話,使用預設的就容易報錯,而我們自己會寫collate_fn,當然就不存在這個問題啦。同時,給大家的一個經驗就是,一般dataset是不會報錯的,而是根據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,避免報錯。
不過話說回來,我個人感受是:
在這裡避免報錯好像也沒有什麼用,因為大多數的神經網路都是定長輸入的,而且很多的操作也要求相同維度才能相加或相乘,所以:這裡不報錯,後面還是報錯。如果後面解決這個問題的方法是:在不足維度上進行補0操作,那麼我們為什麼不在建立dataset之前先補好呢?所以,collate_fn這個東西的應用場景還是有限的。
到此這篇關於pytorch collate_fn的基礎與應用的文章就介紹到這了,更多相關pytorch collate_fn應用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45