当前位置: 首页 > news >正文

卷积神经网络|猫狗分类系列--导入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, labeltrain_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])

http://www.lryc.cn/news/276583.html

相关文章:

  • 【linux 多线程并发】线程本地数据存储的两种方式,每个线程可以有同名全局私有数据,以及两种方式的性能分析
  • 2401d,d导入C的问题
  • SpringCloud GateWay实现路由限流
  • 打印日期c++
  • 数据结构入门到入土——链表(1)
  • MySQL C API的使用
  • JavaScript防御性编程
  • 微信预约小程序制作指南:从小白到专家
  • 向量数据库:Milvus
  • 亚马逊国际商品详情 API:获取特定商品详细信息的实践
  • MSB30M-ASEMI小贴片整流桥MSB30M
  • Redis启动方式
  • TEMU 新手小白必看!2024入驻流程/入驻类目/入驻资料等详细流程讲解
  • 【C语言】数组
  • 常见测试技术都有哪些?
  • Spring事务控制
  • swaggerUI不好用,试试这个openapiUI?
  • 嵌入式物联网项目开发实战例程-STM32F103系列之外围器件代码
  • Docker Compose--部署SpringBoot项目--实战
  • 单电阻FOC算法实现永磁同步电机的调整步骤和设置
  • 化学DS-1040 Tosylate 抑制剂 1335138-89-0科研用途
  • PaddlePaddle初使用
  • 【FPGA】分享一些FPGA数字信号处理相关的书籍
  • 深度解析JavaScript面试热点:事件循环、上下文、箭头函数、变量作用域与ES6模块
  • Javaweb之Mybatis的动态SQL的详细解析
  • 物联网与智能家居:跨境电商与未来生活的融合
  • Java内存模型(JMM)是基于多线程的吗
  • Linux离线安装MySQL(rpm)
  • 用 Socket.D 替代原生 WebSocket 做前端开发
  • Transformer架构和对照代码详解