卷积神经网络 | 您所在的位置:网站首页 › 怎么查狗的品种图片 › 卷积神经网络 |
解决任何真实问题的重要一步是获取数据,Kaggle提供了大量不同数据科学问题的竞赛。 我们将从 https://www.kaggle.com/competitions/dogs-vs-cats/data 下载猫狗数据集,并对其进行一定的操作,以正确的导入到我们的计算机,为接下来的模型训练做准备。 数据集(带有标号的)包含25000张图片,猫狗各一半,图片格式如下: 类别.序号.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 共计25000张。 直接将其导入计算机显然是不行的,我们必须对图片名进行处理,接着构建自己的Dataset类。 首先对图片名进行处理: import ospath="E:\\3-10\\source\\train\\"filenames=[name for name in os.listdir(path)]j=0k=0catList=[]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] #猫标签设置为0 catList.append(dst)#获得cat的图片名集合 else: k=k+1 dst=namelist[0]+str(k)+'.1'+'.'+namelist[2] #狗标签设置为1 dogList.append(dst)#获得dog的图片名集合 dst=path+dst os.rename(src,dst)注:path为下载的数据集图片的路径 在这步操作后,cat和dog的图片名则变为了下列格式: cat1.0.jpg, cat2.0,jpg cat3.0.jpg .... cat12500.0.jpg dog1.1.jpg, dog2.1.jpg .... dog12500.1.jpg 需要强调的是这里的cat1,dog1...,jpg格式仅仅是一个习惯,没有太多的含义,真正重要的是0,1,...,这是个标签,指明了这张图片的类别,并在构建Dataset类时发挥作用。0代表cat,而1代表dog。 同时,catList和dogList还分别存储了猫和狗的图片路径名程,就像这样。 ['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'...] 之所以这样处理,是因为为了易于划分训练集和测试集。 接着,实现自己的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))#修改图片大小,默认大小 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))]) )训练集和测试集按8:2的比例划分。 导入DataLoader: 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)测试: #测试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]) labelstensor([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]) |
CopyRight 2018-2019 实验室设备网 版权所有 |