提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
b站土堆深度学习视频个人学习笔记,温故知新。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Dataset类型
Dataset本质上就是一个抽象类,可以把数据封装成Python可以识别的数据结构。
Dataset类不能实例化,所以在使用Dataset的时候,我们需要定义自己的数据集类,也是Dataset的子类,来继承Dataset类的属性和方法。
二、使用方法
1.引入库
代码如下(示例):
from torch.utils.data import Dataset
from PIL import Image
import os
from torch.utils.data import Dataset
这行代码从torch.utils.data模块中导入了Dataset类。Dataset是PyTorch中用于表示数据集的抽象类,你可以通过继承这个类来创建自定义的数据集。
从PIL库中导入Image模块。PIL(Python Imaging Library)是一个用于处理图像的库,Image模块提供了打开、操作和保存图像的功能。
2.方法定义
代码如下:
class MyData(Dataset):
def __init__(self, root_dir, label_dir):#label_dir为上一级目录的名称
self.root_dir = root_dir
self.label_dir = label_dir
self.path = os.path.join(self.root_dir, self.label_dir)
# os.listdir方法获取self.path目录下的所有文件和子目录的名称,
# 并将这些名称组成的列表赋值给实例变量self.img_path
self.img_path = os.listdir(self.path)
def __getitem__(self, index):
img_name = self.img_path[index]
img_path = os.path.join(self.path, img_name)
img = Image.open(img_path)
label = self.label_dir
return img, label
第一个函数为初始化,参数为图片文件的根目录(root_dir)和上一级目录的名称(label_dir),
os.path.join(self.root_dir, self.label_dir)
通过将这两个路径连接在一起从而得到文件目录的路径。
而os.listdir
方法获取self.path目录下的所有文件和子目录的名称,并将这些名称组成的列表赋值给实例变量self.img_path
第二个函数参数为列表序号idex,传入指定数字通过self.img_path[index]
得到列表中第(index-1)个的图片名称,再将图片路径与图片名称组合得到该图片的完整路径。最终返回图片(img)及其目录名称(label)。
3.具体使用
- 首先将训练集放入项目文件夹中
- 编写完MyData类后添加如下代码
root_dir = 'dataset/train'
ants_label_dir = 'ants_image'
bees_label_dir = 'bees_image'
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)
train_dataset = ants_dataset + bees_dataset
在这段代码中,定义了两个数据集对象 ants_dataset 和 bees_dataset,然后将它们合并成一个名为 train_dataset 的数据集。
4.代码实现
from torch.utils.data import Dataset
from PIL import Image
import os
class MyData(Dataset):
def __init__(self, root_dir, label_dir):#label_dir为上一级目录的名称
self.root_dir = root_dir
self.label_dir = label_dir
self.path = os.path.join(self.root_dir, self.label_dir)
# os.listdir方法获取self.path目录下的所有文件和子目录的名称,
# 并将这些名称组成的列表赋值给实例变量self.img_path
self.img_path = os.listdir(self.path)
def __getitem__(self, index):
img_name = self.img_path[index]
img_path = os.path.join(self.path, img_name)
img = Image.open(img_path)
label = self.label_dir
return img, label
def __len__(self):
return len(self.img_path)
root_dir = 'dataset/train'
ants_label_dir = 'ants_image'
bees_label_dir = 'bees_image'
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)
train_dataset = ants_dataset + bees_dataset
总结(AI总结)
这段代码定义了一个自定义的数据集类 MyData,用于加载图像数据。以下是代码的总结:
-
导入必要的库:
torch.utils.data 中的 Dataset 类,用于创建自定义数据集。
PIL 库中的 Image 类,用于处理图像。
os 库,用于处理文件路径和目录操作。 -
定义 MyData 类
继承自 Dataset 类。
init 方法:
接受 root_dir 和 label_dir 作为参数,分别表示根目录和标签目录。
通过 os.path.join 方法将根目录和标签目录拼接成完整路径,并赋值给 self.path。
使用 os.listdir 方法获取 self.path 目录下的所有文件和子目录的名称,并将这些名称组成的列表赋值给 self.img_path。
getitem 方法:
接受 index 作为参数,返回指定索引的图像和标签。
通过索引获取图像名称,拼接成完整图像路径,并使用 Image.open 方法打开图像。返回图像和标签(即 label_dir)。
len 方法:
返回图像路径列表的长度,即数据集的大小。 -
创建数据集实例:
定义根目录 root_dir 和两个标签目录 ants_label_dir 和 bees_label_dir。
创建两个数据集实例 ants_dataset 和 bees_dataset。
使用 + 运算符将两个数据集合并成一个 train_dataset。
总结来说,这段代码定义了一个用于加载图像数据的自定义数据集类 MyData,并通过实例化该类创建了两个数据集,最后将这两个数据集合并成一个训练数据集。