一、數(shù)據(jù)集
如果在此之前,你已經(jīng)對神經(jīng)網(wǎng)絡(luò)的概念有所了解的話,相信你一定明白數(shù)據(jù)集的重要性。好的數(shù)據(jù)集決定著你的模型的好壞,不過這并不是我們這篇文章所要討論的事情。今天我們所要說的是如何導(dǎo)入數(shù)據(jù)集。
從數(shù)據(jù)集的來源不同,我們對數(shù)據(jù)集的導(dǎo)入分為兩種:
1.從第三方庫中導(dǎo)入
使用PyTorch內(nèi)置的數(shù)據(jù)集類(如torchvision.datasets.ImageFolder、torchvision.datasets.CIFAR10等),這些類提供了訪問常見數(shù)據(jù)集的簡單方法。
下面是一個加載CIFAR10數(shù)據(jù)集的示例代碼
import torchvision.datasets as datasets
import torchvision.transforms as transforms
# 定義數(shù)據(jù)預(yù)處理
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
# 加載CIFAR10數(shù)據(jù)集
trainset = datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
testset = datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
本著負(fù)責(zé)認(rèn)真的態(tài)度,作者在這里有必要認(rèn)真講解下這段代碼的詳細(xì)含義,不過在這之前我們需要思考一下幾個問題,這對學(xué)習(xí)很重要:
①我們導(dǎo)入的數(shù)據(jù)集是圖片數(shù)據(jù)集,怎么將一張圖片用代碼表示?
這時可能會有人說用像素值形成一個矩陣,
對的,沒錯確實(shí)如此,
不過只有黑白照片才可以用一個像素矩陣表示,我們生活中大多數(shù)圖片有顏色的,這就需要了解所謂的顏色通道,常見的是RGB三種(當(dāng)然還有其他的顏色通道),我們以RGB為例:
一張彩色的圖片有三個顏色通道-------由三個顏色(red,green,blue)矩陣表示,那很明顯一個像素矩陣是表示不了的,所以得用三個矩陣來表示。
然而,當(dāng)你把圖像用三個矩陣表示出來并輸入計(jì)算機(jī)中,計(jì)算機(jī)怎么知道這是一個彩色的圖片而不是三個黑白圖呢?
這里們需要引入一個新的數(shù)據(jù)形式,張量(tensor);跟標(biāo)量、向量、矩陣這種常見的結(jié)構(gòu)一樣,張量也是一種數(shù)學(xué)中的一種數(shù)據(jù)形式。
在神經(jīng)網(wǎng)絡(luò)中,張量(tensor)是一種常用的數(shù)據(jù)形式,圖像用作張量來存儲。
②該如何對數(shù)據(jù)集進(jìn)行劃分?
因?yàn)槲覀儾荒苣萌康臄?shù)據(jù)集用來訓(xùn)練,所以需要對數(shù)據(jù)集進(jìn)行劃分,我們希望在導(dǎo)入數(shù)據(jù)集中就能自動劃分,而無需手動劃分。
以下是對上述代碼的詳細(xì)解釋:
# 定義數(shù)據(jù)預(yù)處理
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
#函數(shù)介紹
transforms.Compose 函數(shù),用于將多個變換組合成一個可調(diào)用的變換對象。
預(yù)處理常用的變換包括對圖像進(jìn)行縮放、裁剪、旋轉(zhuǎn)、歸一化等操作,以便更好地適應(yīng)訓(xùn)練模型
#參數(shù)列表:
transforms.ToTensor()表示將圖片轉(zhuǎn)換成向量
transforms.Normalize() 則是將每個通道的像素值減去均值(在這里是 0.5)并除以標(biāo)準(zhǔn)差
(在這里也是 0.5),以使得每個通道的像素值都在 -1 到 1 之間。
# 加載CIFAR10數(shù)據(jù)集
trainset = datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
#以下是參數(shù)列表
root:數(shù)據(jù)集下載位置
train:表示是否為訓(xùn)練集,true表示是訓(xùn)練集,false的話一般是測試集
transform:參數(shù)指定了如何對數(shù)據(jù)進(jìn)行預(yù)處理(或變換),此處參數(shù)指定了在上方所寫的預(yù)處理方式
#至此,我們得到名為trainset的變量,它是一個包含 CIFAR-10 訓(xùn)練集的 torchvision.datasets.CIFAR10 對象,其中包含了處理后的圖像數(shù)據(jù)和對應(yīng)的標(biāo)簽。
testset = datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
接下來,我們試著打印下訓(xùn)練集:
2.導(dǎo)入本地的數(shù)據(jù)集
如果已經(jīng)下載好了,或者自己標(biāo)注的數(shù)據(jù)集,我們則需要導(dǎo)入本地?cái)?shù)據(jù)集
自定義數(shù)據(jù)集類,這個方法適用于加載自己的數(shù)據(jù)集。下面是一個示例代碼,后面再做詳細(xì)解釋:
import torchvision
LOAD_CIFAR = True
DOWNLOAD_CIFAR = True
train_data = torchvision.datasets.CIFAR10(
root='./data/',
train=True,
transform=torchvision.transforms.ToTensor(),
download=DOWNLOAD_CIFAR,
)
老樣子,為了更好理解,我們需要考慮幾個問題(不過在這之前我希望您能先自己想想):
①怎么將多個圖片(幾千,甚至幾萬張)導(dǎo)入代碼中,并存儲起來?
我們并不是將圖片都讀入代碼中,我們只是將圖片對應(yīng)的文件地址以及標(biāo)簽對應(yīng)的名字分別寫入圖片列表列表和標(biāo)簽列表中。
具體代碼在本文不在書寫,請參考其他文章。
②圖片數(shù)據(jù)集往往是有標(biāo)注的,但是圖片不能寫文字,所以怎么將標(biāo)注和圖片一一對應(yīng)?
將圖片和標(biāo)注一一對應(yīng)可以通過兩種方式實(shí)現(xiàn):
1.文件名對應(yīng)法
一種常見的方法是將圖片文件名與標(biāo)注文件名保持一致或者有一定的規(guī)律。例如,可以將圖片文件命名為1.jpg,2.jpg,3.jpg等,對應(yīng)的標(biāo)注文件命名為1.txt,2.txt,3.txt等。這樣可以通過文件名的對應(yīng)關(guān)系來將圖片和標(biāo)注一一對應(yīng)。
2.數(shù)據(jù)庫存儲法
另一種方法是將圖片和標(biāo)注數(shù)據(jù)存儲到數(shù)據(jù)庫中。每張圖片都有一個唯一的標(biāo)識符(比如圖片的文件名或者數(shù)據(jù)庫中的id),在數(shù)據(jù)庫中與該圖片對應(yīng)的標(biāo)注數(shù)據(jù)也被存儲在同一行中,這樣可以確保圖片和標(biāo)注一一對應(yīng)
③怎么區(qū)分?jǐn)?shù)據(jù)集和訓(xùn)練集合?
這里需要用到一個函數(shù)
CustomDataset是一個自定義的數(shù)據(jù)集類,它的構(gòu)造函數(shù)需要兩個參數(shù):txt_path和transform。其中,txt_path是包含數(shù)據(jù)集信息的文本文件的路徑,transform是對數(shù)據(jù)集進(jìn)行預(yù)處理的函數(shù)或變換。
train_dataset = CustomDataset(txt_path='./train.txt', transform=transform)
test_dataset = CustomDataset(txt_path='./test.txt', transform=transform)
③怎么使用這些數(shù)據(jù)集?因?yàn)槲覀儾豢赡芤粡堃粡埖恼{(diào)用吧,最好想上方代碼中一樣,交給一個對象管理
開發(fā)者自然想到這個問題,為此提供了一個專門的數(shù)據(jù)類數(shù)據(jù)加載器(DataLoader),這個類很重要,神經(jīng)網(wǎng)絡(luò)訓(xùn)練都是使用這個類,其主要用于將數(shù)據(jù)集分批加載到內(nèi)存中,以便在訓(xùn)練過程中更高效地處理數(shù)據(jù)。
以下是代碼實(shí)例:文章來源:http://www.zghlxwxcb.cn/news/detail-639473.html
dataloader = DataLoader(dataset, batch_size=3, shuffle=True)
#其參數(shù)含義如下
dataset是一個PyTorch的數(shù)據(jù)集對象,它包含了整個數(shù)據(jù)集。
batch_size=3:每個批次中包含3個數(shù)據(jù)樣本。
shuffle=True:每次獲取批次數(shù)據(jù)時是否對數(shù)據(jù)集進(jìn)行隨機(jī)打亂操作,這樣可以增加模型的魯棒性,
防止模型對數(shù)據(jù)的順序產(chǎn)生過擬合。
DataLoader是PyTorch中一個用于加載數(shù)據(jù)的工具類,它能夠?qū)?shù)據(jù)集中的數(shù)據(jù)轉(zhuǎn)換成批次的數(shù)據(jù),方便機(jī)器學(xué)習(xí)模型的訓(xùn)練。
因此,這段代碼的含義是創(chuàng)建一個能夠?qū)ataset中的數(shù)據(jù)分批次加載的數(shù)據(jù)加載器,每個批次包含3個隨機(jī)排列的數(shù)據(jù)樣本。文章來源地址http://www.zghlxwxcb.cn/news/detail-639473.html
到了這里,關(guān)于從零構(gòu)建自己的神經(jīng)網(wǎng)絡(luò)————數(shù)據(jù)集篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!