初學pytorch, 一直分不清資料是如何載入的,分不清dataset 和 dataloader的聯絡。
utils包含dataset和dataloader兩個類。自定義資料集需要繼承這個類,並實現兩個函式,乙個是__len__,另乙個是__getitem__,前者提供資料的大小,後者通過索引獲取資料和標籤。
__getitem__一次只能獲取乙個資料,所以需要通過dataloader來定義乙個新的迭代器,實現batch讀取。
下面舉乙個直觀的小例子來搞明白是怎麼回事!
以上資料以tuple 返回,每次只返回乙個樣本,如果希望批量處理batch,需要用到dataloaderimport torch
from torch.utils import data
import numpy as np
'''資料集:
label:data
0:[1, 2],
1:[3, 4],
0:[2, 1],
1:[3, 4],
2:[4, 5]
'''class
textdataset
(data.dataset)
:# 繼承dataset
def__init__
(self)
: self.data = np.asarray([[
1,2]
,[3,
4],[
2,1]
,[3,
4],[
4,5]
])# 一些由2維向量表示的資料集
self.label = np.asarray([0
,1,0
,1,2
])# 資料集對應的標籤
def__getitem__
(self, item)
: text = torch.from_numpy(self.data[item]
)# 把numpy轉化為tensor
label = torch.tensor(self.label[item]
)return text, label
def__len__
(self)
:return
len(self.data)
# 獲取資料集中資料
test = textdataset(
(test[3]
)# 相當於呼叫getitem(3)
# 輸出:
# (tensor([3, 4], dtype=torch.int32), tensor(1, dtype=torch.int32))
其中乙個data變成原來兩組data的組成test_loader = data.dataloader(test,batch_size=
2,shuffle=
false
)for i, traindata in
enumerate
(test_loader)
("i:"
,i) data, label = traindata
("data:"
, data)
# 其中乙個data包含2組資料,乙個batch大小
("label:"
, label)
# 輸出:
# i: 0
# data: tensor([[1, 2],
# [3, 4]], dtype=torch.int32)
# label: tensor([0, 1], dtype=torch.int32)
# i: 1
# data: tensor([[2, 1],
# [3, 4]], dtype=torch.int32)
# label: tensor([0, 1], dtype=torch.int32)
# i: 2
# data: tensor([[4, 5]], dtype=torch.int32)
# label: tensor([2], dtype=torch.int32)
相應的label也變成了原來對應的兩個label的組成
.參考於吳茂貴的python深度學習
datareader和dataset的區別
dataset是乙個記憶體資料庫,你取資料的時候可以把資料放進去,資料取完就可以斷開連線了,這樣你就可以在dataset中去取資料,和資料庫就無關了。這樣非常方便,但有個問題,你把資料放記憶體裡,是要占用記憶體空間的,如果這個dataset中放了很多資料的話,效率就有問題了,你在乙個大的datase...
DataReader和DataSet的區別
1.datareader是資料管理提供者類,而dataset是一般性資料類。2.dataset獲取資料需要通過橋梁dataadapter的填充,由於datareader本身就是管理提供者,它可以通過command的executereader 方法就可以獲取資料。4.datareader只能正向讀取資...
DataSet和DataReader的適用環境
ado.net2.0提供了兩個用於檢索關係資料的物件 dataset和datareader。並且這兩個物件都可以將檢索的關係資料儲存在記憶體中。在軟體開發過程中經常用到這兩個控制項,由於這兩個控制項在使用和功能方面的相似,很多程式設計師錯誤地認為dataset和datareader是可以相互替代的。...