解決任何真實(shí)問(wèn)題的重要一步是獲取數(shù)據(jù),Kaggle提供了大量不同數(shù)據(jù)科學(xué)問(wèn)題的競(jìng)賽。
我們將從
https://www.kaggle.com/competitions/dogs-vs-cats/data
下載貓狗數(shù)據(jù)集,并對(duì)其進(jìn)行一定的操作,以正確的導(dǎo)入到我們的計(jì)算機(jī),為接下來(lái)的模型訓(xùn)練做準(zhǔn)備。
數(shù)據(jù)集(帶有標(biāo)號(hào)的)包含25000張圖片,貓狗各一半,圖片格式如下:
類別.序號(hào).jpg,比如
-
cat.1.jpg,cat.2.jpg,cat.3.jpg,....cat.12449.jpg
-
dog.1.jpg,dog.2.jpg,dog.3.jpg,.....dog.12499.jpg
共計(jì)25000張。
直接將其導(dǎo)入計(jì)算機(jī)顯然是不行的,我們必須對(duì)圖片名進(jìn)行處理,接著構(gòu)建自己的Dataset類。
首先對(duì)圖片名進(jìn)行處理:
import os
path="E:\\3-10\\source\\train\\"
filenames=[name for name in os.listdir(path)]
j=0
k=0
catList=[]
dogList=[]
for i,filename in enumerate(filenames):
src=path+filename
namelist=filename.split('.')
if namelist[0]=='cat':
j=j+1
dst=namelist[0]+str(j)+'.0'+'.'+namelist[2] #貓標(biāo)簽設(shè)置為0
????????catList.append(dst)#獲得cat的圖片名集合
else:
k=k+1
dst=namelist[0]+str(k)+'.1'+'.'+namelist[2] #狗標(biāo)簽設(shè)置為1
????????dogList.append(dst)#獲得dog的圖片名集合
dst=path+dst
os.rename(src,dst)
注:path為下載的數(shù)據(jù)集圖片的路徑
在這步操作后,cat和dog的圖片名則變?yōu)榱讼铝懈袷剑?/p>
-
cat1.0.jpg,
-
cat2.0,jpg
-
cat3.0.jpg
-
....
-
cat12500.0.jpg
-
dog1.1.jpg,
-
dog2.1.jpg
-
....
-
dog12500.1.jpg
需要強(qiáng)調(diào)的是這里的cat1,dog1...,jpg格式僅僅是一個(gè)習(xí)慣,沒(méi)有太多的含義,真正重要的是0,1,...,這是個(gè)標(biāo)簽,指明了這張圖片的類別,并在構(gòu)建Dataset類時(shí)發(fā)揮作用。0代表cat,而1代表dog。
同時(shí),catList和dogList還分別存儲(chǔ)了貓和狗的圖片路徑名程,就像這樣。
-
['cat1.0.jpg', 'cat2.0.jpg', 'cat3.0.jpg', 'cat4.0.jpg', 'cat5.0.jpg'...]
-
['dog1.1.jpg', 'dog2.1.jpg', 'dog3.1.jpg', 'dog4.1.jpg', 'dog5.1.jpg'...]
之所以這樣處理,是因?yàn)闉榱艘子趧澐?strong>訓(xùn)練集和測(cè)試集。
接著,實(shí)現(xiàn)自己的Dataset類???????
import torch
import os
from torch.utils.data import Dataset
from torchvision import transforms
from PIL import Image
import numpy as np
class MyDataset(Dataset):
def __init__(self,path_file,namelists,transform=None):
self.path_file=path_file
self.imgs=namelists
self.transform=transform
def __len__(self):
return len(self.imgs)
def __getitem__(self, idx):
#get the image
img_path = os.path.join(self.path_file,self.imgs[idx])
image=Image.open(img_path)
image=image.resize((28,28))#修改圖片大小,默認(rèn)大小
if self.transform:
image = self.transform(image)
#get the label
str1=self.imgs[idx].split('.')
label=eval(str1[1])
return image, label
train_data=MyDataset(path,catList[0:10000]+dogList[0:10000],transform=transforms.Compose([transforms.ToTensor(),
transforms.Resize((224,224))]) )
test_data=MyDataset(path,catList[10000:12500]+dogList[10000:12500],transform=transforms.Compose([transforms.ToTensor(),
transforms.Resize((224,224))]) )
訓(xùn)練集和測(cè)試集按8:2的比例劃分。
導(dǎo)入DataLoader:???????文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-818504.html
train_loader=torch.utils.data.DataLoader(train_data, batch_size=32, shuffle=True)
test_loader=torch.utils.data.DataLoader(test_data,?batch_size=32,?shuffle=True)
測(cè)試:???????文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-818504.html
#測(cè)試
len(train_data)
20000
len(test_data)
5000
imgs,labels=next(iter(train_loader))
imgs.size()
torch.Size([32, 3, 224, 224])
labels.size()
torch.Size([32])
labels
tensor([0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0, 0])
到了這里,關(guān)于卷積神經(jīng)網(wǎng)絡(luò)|貓狗分類系列--導(dǎo)入kaggle貓狗數(shù)據(jù)集的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!