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

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

三、ImageFolder

四、LSUN Classification

五、COCO (Captioning and Detection)

六、我們進(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)。

我們在寫完上面三行代碼后,在寫一行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)
那么我們就寫下了這幾行代碼:

下面我們需要對數(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ù)了。
