卷积神经网络|猫狗分类系列--导入kaggle猫狗数据集

解决任何真实问题的重要一步是获取数据,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])

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的示例代码,用于在MATLAB中使用卷积神经网络CNN)对进行图像分类。 首先,我们需要准备数据。我们可以使用Kaggle上的“Dogs vs. Cats”数据集,该数据集包含25000张的图像。其中,训练集包含20000张图像,测试集包含5000张图像。 ```matlab % 加载数据集 imds_train = imageDatastore('train', 'IncludeSubfolders', true, 'LabelSource', 'foldernames'); imds_test = imageDatastore('test', 'IncludeSubfolders', true, 'LabelSource', 'foldernames'); % 设置训练参数 opts = trainingOptions('sgdm', ... 'InitialLearnRate', 0.001, ... 'MaxEpochs', 20, ... 'MiniBatchSize', 32, ... 'Plots', 'training-progress'); % 定义卷积神经网络 layers = [ imageInputLayer([224 224 3]) convolution2dLayer(3, 64, 'Padding', 'same') batchNormalizationLayer reluLayer maxPooling2dLayer(2, 'Stride', 2) convolution2dLayer(3, 128, 'Padding', 'same') batchNormalizationLayer reluLayer maxPooling2dLayer(2, 'Stride', 2) convolution2dLayer(3, 256, 'Padding', 'same') batchNormalizationLayer reluLayer convolution2dLayer(3, 256, 'Padding', 'same') batchNormalizationLayer reluLayer maxPooling2dLayer(2, 'Stride', 2) convolution2dLayer(3, 512, 'Padding', 'same') batchNormalizationLayer reluLayer convolution2dLayer(3, 512, 'Padding', 'same') batchNormalizationLayer reluLayer maxPooling2dLayer(2, 'Stride', 2) convolution2dLayer(3, 512, 'Padding', 'same') batchNormalizationLayer reluLayer convolution2dLayer(3, 512, 'Padding', 'same') batchNormalizationLayer reluLayer maxPooling2dLayer(2, 'Stride', 2) fullyConnectedLayer(4096) reluLayer dropoutLayer(0.5) fullyConnectedLayer(4096) reluLayer dropoutLayer(0.5) fullyConnectedLayer(2) softmaxLayer classificationLayer]; % 训练卷积神经网络 net = trainNetwork(imds_train, layers, opts); % 在测试集上测试卷积神经网络 YPred = classify(net, imds_test); YTest = imds_test.Labels; accuracy = sum(YPred == YTest) / numel(YTest); fprintf('测试准确率为 %.2f%%\n', accuracy * 100); ``` 在上面的代码中,我们首先使用`imageDatastore`函数加载数据集。然后,我们定义了一个包含卷积层、池化层、全连接层等的卷积神经网络。接着,我们使用`trainNetwork`函数对卷积神经网络进行训练,并在测试集上测试了准确率。 需要注意的是,上述代码中的卷积神经网络比较深,训练时间可能会比较长。如果你的计算机性能不够强大,可以考虑减少网络的深度或者使用更小的图像尺寸。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值