超簡單!pytorch入門教程(四):準(zhǔn)備圖片數(shù)據(jù)集

在訓(xùn)練神經(jīng)網(wǎng)絡(luò)之前,我們必須有數(shù)據(jù),作為資深伸手黨,必須知道以下幾個(gè)數(shù)據(jù)提供源:

一、CIFAR-10

CIFAR-10圖片樣本截圖

CIFAR-10是多倫多大學(xué)提供的圖片數(shù)據(jù)庫,圖片分辨率壓縮至32x32,一共有10種圖片分類,均進(jìn)行了標(biāo)注。適合監(jiān)督式學(xué)習(xí)。CIFAR-10數(shù)據(jù)下載頁面

二、ImageNet

imagenet首頁

ImageNet首頁

三、ImageFolder

imagefolder首頁

ImageFolder首頁

四、LSUN Classification

LSUN Classification

LSUN 圖片下載地址

五、COCO (Captioning and Detection)

coco首頁

COCO首頁地址

六、我們進(jìn)入正題

為了方便加載以上五種數(shù)據(jù)庫的數(shù)據(jù),pytorch團(tuán)隊(duì)幫我們寫了一個(gè)torchvision包。使用torchvision就可以輕松實(shí)現(xiàn)數(shù)據(jù)的加載和預(yù)處理。

我們以使用CIFAR10為例:

導(dǎo)入torchvision的庫:

import torchvision

import torchvision.transforms as transforms? # transforms用于數(shù)據(jù)預(yù)處理

使用datasets.CIFAR10()函數(shù)加載數(shù)據(jù)庫。CIFAR10有60000張圖片,其中50000張是訓(xùn)練集,10000張是測試集。

#訓(xùn)練集,將相對目錄./data下的cifar-10-batches-py文件夾中的全部數(shù)據(jù)(50000張圖片作為訓(xùn)練數(shù)據(jù))加載到內(nèi)存中,若download為True時(shí),會(huì)自動(dòng)從網(wǎng)上下載數(shù)據(jù)并解壓trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=False, transform=None)

下面簡單講解root、train、download、transform這四個(gè)參數(shù)

1.root,表示cifar10數(shù)據(jù)的加載的相對目錄

2.train,表示是否加載數(shù)據(jù)庫的訓(xùn)練集,false的時(shí)候加載測試集

3.download,表示是否自動(dòng)下載cifar數(shù)據(jù)集

4.transform,表示是否需要對數(shù)據(jù)進(jìn)行預(yù)處理,none為不進(jìn)行預(yù)處理

由于美帝路途遙遠(yuǎn),靠命令臺(tái)進(jìn)程下載100多M的數(shù)據(jù)速度很慢,所以我們可以自己去到cifar10的官網(wǎng)上把CIFAR-10 python version下載下來,然后解壓為cifar-10-batches-py文件夾,并復(fù)制到相對目錄./data下。(若設(shè)置download=True,則程序會(huì)自動(dòng)從網(wǎng)上下載cifar10數(shù)據(jù)到相對目錄./data下,但這樣小伙伴們可能要等一個(gè)世紀(jì)了),并對訓(xùn)練集進(jìn)行加載(train=True)。


如圖所示,在腳本文件下建一個(gè)data文件夾,然后把數(shù)據(jù)集文件夾丟到里面去就好了,注意cifar-10-batches-py文件夾名字不能自己任意改。

我們在寫完上面三行代碼后,在寫一行print一下trainset的大小看看:

print len(trainset)

#結(jié)果:50000

我們在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),使用的是mini-batch(一次輸入多張圖片),所以我們在使用一個(gè)叫DataLoader的工具為我們將50000張圖分成每四張圖一分,一共12500份的數(shù)據(jù)包。

#將訓(xùn)練集的50000張圖片劃分成12500份,每份4張圖,用于mini-batch輸入。shffule=True在表示不同批次的數(shù)據(jù)遍歷時(shí),打亂順序(這個(gè)需要在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)再來講)。num_workers=2表示使用兩個(gè)子進(jìn)程來加載數(shù)據(jù)

import torch

trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=False, num_workers=2)

那么我們就寫下了這幾行代碼:

print的結(jié)果為50000和12500

下面我們需要對數(shù)據(jù)進(jìn)行預(yù)處理,什么是預(yù)處理?為什么要預(yù)處理?如果不知道的小盆友可以看看下面幾個(gè)鏈接,或許對你有幫助。神經(jīng)網(wǎng)絡(luò)為什么要?dú)w一化,深度學(xué)習(xí)-----數(shù)據(jù)預(yù)處理。還無法理解也沒關(guān)系,只要記住,預(yù)處理會(huì)幫助我們加快神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。

在pytorch中我們預(yù)處理用到了transforms函數(shù):

transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),])

compose函數(shù)會(huì)將多個(gè)transforms包在一起。

我們的transforms有好幾種,例如transforms.ToTensor(), transforms.Scale()等,完整列表在。好好學(xué)習(xí)吧!

我只講現(xiàn)在用到了兩種:

1.ToTensor是指把PIL.Image(RGB) 或者numpy.ndarray(H x W x C) 從0到255的值映射到0到1的范圍內(nèi),并轉(zhuǎn)化成Tensor格式。

2.Normalize(mean,std)是通過下面公式實(shí)現(xiàn)數(shù)據(jù)歸一化

channel=(channel-mean)/std

那么經(jīng)過上面兩個(gè)轉(zhuǎn)換一折騰,我們的數(shù)據(jù)中的每個(gè)值就變成了[-1,1]的數(shù)了。

1到22行,我們從硬盤中讀取數(shù)據(jù),并將數(shù)據(jù)預(yù)處理(第13行,transform=transform),然后轉(zhuǎn)換成4張圖為一批的數(shù)據(jù)結(jié)構(gòu)。26行到47行,為我們顯示出一個(gè)圖片例子,可有可無,不再作代碼解釋。

源代碼下載





更多torchvision加載其他數(shù)據(jù)庫方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容