PyTorch入门之【dataset】

参考:https://www.bilibili.com/video/BV1DV4y1y7KG/?spm_id_from=333.999.0.0\&vd_source=98d31d5c9db8c0021988f2c2c25a9620

目录

使用Pytorch自带的dataset

在 PyTorch 中,torchvision.datasets 包中提供了许多经典数据集的实现,你可以使用它们来训练和测试模型。

当然这些数据集是在服务器上的它在使用的时候是联网下载的。首次运行会下载,再次运行就不用下载了。

这里以经典的MNIST 数据集为例。
总代码如下:

python 复制代码
import torch
from torchvision import datasets
import matplotlib.pyplot as plt
from torch.utils.data import DataLoader
from torchvision import transforms

# define a transform
transform = transforms.Compose([
    transforms.Resize(24),
    transforms.RandomRotation(10),
    transforms.ToTensor()
])

# download training & testing dataset
training_data = datasets.MNIST(
    root='data',
    train=True,
    download=True,
    transform=transform
)

test_data = datasets.MNIST(
    root='data',
    train=False,
    download=True,
    transform=transform
)

# create label to idx dictionary
labels = {i: training_data.classes[i] for i in range(len(training_data.classes))}

# display images in MNIST
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3
for i in range(1, cols * rows + 1):
    sample_idx = torch.randint(len(training_data), size=(1,)).item()
    img, label = training_data[sample_idx]
    figure.add_subplot(rows, cols, i)
    plt.title(labels[label])
    plt.axis("off")
    plt.imshow(img.squeeze(), cmap="gray")
plt.show()

# create dataloader
train_data_loader = DataLoader(training_data, batch_size=16, shuffle=True)
test_data_loader = DataLoader(test_data, batch_size=16, shuffle=True)
print(next(iter(train_data_loader))[0].shape)

下面挨个看各个模块的作用:

python 复制代码
# define a transform
transform = transforms.Compose([
    transforms.Resize(24),
    transforms.RandomRotation(10),
    transforms.ToTensor()
])

这段代码定义了一个数据转换管道,它将一系列的图像处理操作串联起来,以便对图像进行预处理。

  • transforms.Grayscale():将彩色图像转换为灰度图像。
  • transforms.Resize(24):调整图像的大小为 24x24 像素。
  • transforms.RandomRotation(10):随机旋转图像最多 10 度,增加数据的多样性和鲁棒性。
  • transforms.ToTensor():将图像转换为张量形式,以便进行后续的数据处理和模型训练。

通过将上述操作按照顺序组合在一起,你可以定义一个 transform 对象,用于对图像数据集中的每个图像进行预处理。该 transform 对象被用于加载 MNIST 数据集,并且在 DataLoader 中配合使用。这样的数据预处理流程在深度学习中非常常见,它能够帮助提高模型训练的效果和泛化能力。你可以根据自己的需求,定制不同的转换操作,以适应不同的任务和数据集特点。

python 复制代码
# download training & testing dataset
training_data = datasets.MNIST(
    root='data',
    train=True,
    download=True,
    transform=transform
)

test_data = datasets.MNIST(
    root='data',
    train=False,
    download=True,
    transform=transform
)

上述代码就是下载training_data和test_data数据。
download=True 参数用于指定是否下载数据集。当该参数设置为 True 时,如果数据集尚未下载,则会自动下载数据集。如果数据集已经存在,将不会再次下载。在加载数据集时 datasets.MNIST() 会检查文件是否下载过。

python 复制代码
# create label to idx dictionary
labels = {i: training_data.classes[i] for i in range(len(training_data.classes))}

这段代码的作用是将 MNIST 训练集的类别标签映射为整数索引,并将其存储在 labels 字典中。

这个MNIST 训练集是用来区分0-9的数据集,故这里就可以将0映射到0,1映射到1以此类推。

python 复制代码
# display images in MNIST
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3
for i in range(1, cols * rows + 1):
    sample_idx = torch.randint(len(training_data), size=(1,)).item()
    img, label = training_data[sample_idx]
    figure.add_subplot(rows, cols, i)
    plt.title(labels[label])
    plt.axis("off")
    plt.imshow(img.squeeze(), cmap="gray")
plt.show()

上述代码就是将MNIST数据集中随机的生成9个图片打印出来,为了验证一下我们的MNIST数据集是否成功的加载

python 复制代码
# create dataloader
train_data_loader = DataLoader(training_data, batch_size=16, shuffle=True)
test_data_loader = DataLoader(test_data, batch_size=16, shuffle=True)
print(next(iter(train_data_loader))[0].shape)

上述代码用于创建数据加载器 (DataLoader),设置批次以及是否shuffle。

用户自定义的dataset

python 复制代码
import torch
import matplotlib.pyplot as plt
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision.datasets import ImageFolder


# define a transform
transform = transforms.Compose([
    transforms.Grayscale(),
    transforms.Resize(24),
    transforms.RandomRotation(10),
    transforms.ToTensor()
])

# create dataset
my_mnist = ImageFolder(root='./my-mnist', transform=transform)

# create label to idx dictionary
labels = {i: my_mnist.classes[i] for i in range(len(my_mnist.classes))}

# display images in MNIST
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3
for i in range(1, cols * rows + 1):
    sample_idx = torch.randint(len(my_mnist), size=(1,)).item()
    img, label = my_mnist[sample_idx]
    figure.add_subplot(rows, cols, i)
    plt.title(labels[label])
    plt.axis("off")
    plt.imshow(img.squeeze(), cmap="gray")
plt.show()

# create dataloader
train_data_loader = DataLoader(my_mnist, batch_size=16, shuffle=True)
print(next(iter(train_data_loader))[0].shape)

总的代码几乎差不多,唯一有区别的就是数据是从自己定义的路径下加载的。

使用 ImageFolder 类创建数据集 my_mnist

相关推荐
AI视觉网奇几秒前
音频获取长度
java·前端·python
寄思~19 分钟前
学习笔记:封装和单继承
开发语言·笔记·python·学习
E_ICEBLUE40 分钟前
Python 操作 Word 文档:主流库对比与选择指南
开发语言·经验分享·python·word·办公自动化
倔强青铜三40 分钟前
苦练Python第38天:input() 高级处理,安全与异常管理
人工智能·python·面试
计算机科研圈1 小时前
不靠海量数据,精准喂养大模型!上交Data Whisperer:免训练数据选择法,10%数据逼近全量效果
人工智能·深度学习·机器学习·llm·ai编程
大模型真好玩1 小时前
深入浅出LangChain AI Agent智能体开发教程(六)—两行代码LangChain Agent API快速搭建智能体
人工智能·python·agent
大千AI助手1 小时前
FEVER数据集:事实验证任务的大规模基准与评估框架
人工智能·深度学习·数据集·fever·事实验证·事实抽取·虚假信息
德育处主任Pro1 小时前
『React』 组件通信全攻略
python·opencv·matplotlib
格林威1 小时前
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现道路汽车的检测识别(C#代码,UI界面版)
人工智能·深度学习·数码相机·yolo·视觉检测
七七软件开发2 小时前
一对一交友小程序 / APP 系统架构分析
java·python·小程序·系统架构·php