如何使用數(shù)據(jù)集DataSet? 在介紹DataLoader之前,需要先了解數(shù)據(jù)集DataSet的使用。Pytorch中集成了很多已經(jīng)處理好的數(shù)據(jù)集,在pytorch的torchvision、torchtext等模塊有一些典型的數(shù)據(jù)集,可以通過(guò)配置來(lái)下載使用。 以CIFAR10 數(shù)據(jù)集為例,文檔已經(jīng)描
Pytorch中集成了大量已處理好的數(shù)據(jù)集,在torchvision、torchtext等模塊中都有一些典型的數(shù)據(jù)集,用戶可以通過(guò)配置來(lái)下載并使用這些數(shù)據(jù)集。例如,CIFAR10 數(shù)據(jù)集已經(jīng)被描述得非常清晰了。其中要注意的是 transform 這個(gè)參數(shù),可以用來(lái)將圖像轉(zhuǎn)換為所需要的格式,比如將PIL格式的圖像轉(zhuǎn)化為tensor格式的圖像。
在介紹 DataLoader 之前,需要先了解如何使用 DataSet。Pytorch 中的DataSet是一個(gè)存儲(chǔ)所有數(shù)據(jù)(例如圖像、音頻)的容器。DataLoader 就是另一個(gè)具有更好收納功能的容器,其中分隔開(kāi)來(lái)很多小隔間,可以自己設(shè)定一個(gè)小隔間有多少個(gè)數(shù)據(jù)集的數(shù)據(jù)來(lái)組成,每次將數(shù)據(jù)放進(jìn)收納小隔間的時(shí)候要不要把源數(shù)據(jù)集打亂再進(jìn)行收納等等。
給定了一個(gè)數(shù)據(jù)集,用戶可以決定如何從數(shù)據(jù)集里面拿取數(shù)據(jù)來(lái)進(jìn)行訓(xùn)練,比如一次拿取多少數(shù)據(jù)作為一個(gè)對(duì)象來(lái)對(duì)數(shù)據(jù)集進(jìn)行分割,對(duì)數(shù)據(jù)集進(jìn)行分割之前要不要打亂數(shù)據(jù)集等等。DataLoader的結(jié)果就是一個(gè)對(duì)數(shù)據(jù)集進(jìn)行分割的大字典列表,列表中的每個(gè)對(duì)象都是由設(shè)置的多少個(gè)數(shù)據(jù)集的對(duì)象組合而成的。
首先需要先理解 __getitem__ 方法。__getitem__被稱為魔法方法,在Python中定義一個(gè)類的時(shí)候,如果想要通過(guò)鍵來(lái)得到類的輸出值,就需要 __getitem__ 方法。__getitem__ 方法的作用就是在調(diào)用類的時(shí)候自動(dòng)的運(yùn)行 __getitem__ 方法的內(nèi)容,得結(jié)果并返回。
class Fib():
def __init__(self,start=0,step=1):
self.step=step
def __getitem__(self, key):
a = key+self.step
return a
s=Fib()
s[1]
例如,在Pytorch中的CIFAR10數(shù)據(jù)集中,可以看到源碼中的 __getitem__ 方法是這樣的。
def __getitem__(self, index: int) -> Tuple[Any, Any]:
img, target = self.data[index], self.targets[index]
img = Image.fromarray(img)
if self.transform is not None:
img = self.transform(img)
if self.target_transform is not None:
target = self.target_transform(target)
return img, target
用戶可以在Pytorch的Documents文檔中查看DataLoader的使用方法。其中介紹幾個(gè)比較常用的參數(shù),例如 dataset,batch_size,shuffle,num_workers 和 drop_last。其中,batch_size表示在數(shù)據(jù)集容器中一次拿取多少數(shù)據(jù),shuffle表示是否在每次操作的時(shí)候打亂數(shù)據(jù)集,一般選擇為True。num_workers表示多線程進(jìn)行拿取數(shù)據(jù)操作,0表示只在主線程中操作。drop_last表示如果拿取數(shù)據(jù)有余數(shù),是否保留最后剩下的部分。
dataset:就是用戶的數(shù)據(jù)集,構(gòu)建好數(shù)據(jù)集對(duì)象后傳入即可。
shuffle:是否在每次操作的時(shí)候打亂數(shù)據(jù)集,一般選擇為True。
num_workers: 多線程進(jìn)行拿取數(shù)據(jù)操作,0表示只在主線程中操作。
drop_last:如果拿取數(shù)據(jù)有余數(shù),是否保留最后剩下的部分。
例如,在后面的代碼中,如果設(shè)置 drop_last=False,那么一共有156次數(shù)據(jù)拿取,并且最后一次剩余的部分不會(huì)被丟棄。如果設(shè)置 drop_last=True,那么最后剩余的部分被丟棄,并且拿取次數(shù)也少了一次。
初步使用的代碼如下:
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
test_data=torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor())
test_dataloader=DataLoader(dataset=test_data,batch_size=4,shuffle=True,num_workers=0,drop_last=True)
writer=SummaryWriter("logs")
step=0
for data in test_dataloader:
images,targets=data
writer.add_images("test_03",images,step)
step=step+1
writer.close()
然后配合使用tensorboard就可以直觀體會(huì)到它的使用方法了。
小編推薦閱讀機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對(duì)象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀基于鴻蒙NEXT的血型遺傳計(jì)算器開(kāi)發(fā)案例
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動(dòng)態(tài)代理的對(duì)比分析
閱讀Win11筆記本“自動(dòng)管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)