加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 01、PyTorch自带的数据集使用
    • 02、自定义数据集的使用
    • 03、PyTorch中的数据预处理模块transforms
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

深度学习编程基础 | Pytorch中的数据处理操作

05/10 08:53
895
阅读需 17 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在深度学习处理复杂任务时,数据预处理是至关重要的一环。PyTorch作为一款热门的深度学习框架,提供了丰富的数据处理工具。通过PyTorch,开发者可以轻松地完成数据的加载、清洗、增强、转换等操作,以确保数据的质量并适应模型的需求。这些操作对于提高模型的训练效率和泛化能力具有重要意义。

01、PyTorch自带的数据集使用

在深度学习中,常用的数据集有手写数字数据集MNIST,小图像分类数据集CIFAR10和CIFAR100,人脸表情数据集JAFFE,及Pascal VOC数据集等,而COCO和ImageNet数据集是两个超大规模的数据集。以MNIST数据集为例,该数据集由手写数字图像构成。训练集有60000幅图像,测试集有10000幅图像。每幅MNIST图像是28×28像素的灰度图像,包含一个手写数字,图像的标签为0~9之间的某个数字。在torchvision包的datasets模块,有多个Pytorch自带的数据集可供使用。以手写数字数据集MNIST为例,使用方法如下:

# 使用torchvision.datasets包下的MNIST数据集类
from torchvision.datasets import MNIST
from torchvision import transforms
from torch.utils.data import DataLoader

# 定义图像预处理操作
transform = transforms.Compose([
transforms.Resize(32),
transforms.RandomHorizontalFlip(0.5),
transforms.ToTensor()
])
train_dataset = MNIST(
root='./data',# 数据集的存放或下载地址
    transform=transform,#数据预处理
    train=True,# 是否为训练集
    download=True# 是否下载,如果上述地址已存在该数据集则不下载
)
test_dataset = MNIST(
root='./data',
transform=transform,
train=True,
download=True
)
# 将预处理好的数据集变为可迭代对象,每次使用一个batch数量的数据
train_loader = DataLoader(
dataset=train_dataset,# 数据集
    batch_size=16,# batch大小
    shuffle=True# 是否打乱顺序后取出
)
test_loader = DataLoader(
dataset=test_dataset,
batch_size=16,
shuffle=False
)

训练网络模型时,使用train_loader或test_loader,每次可取出一个batch大小的数据。

# 查看预处理后的一个MNIST数据及其标签
print(train_dataset[0])
# 查看预处理后的一个MNIST数据的形状
print(train_dataset[0][0].shape)
输出:
(tensor([[[0., 0., 0.,  ..., 0., 0., 0.],
[0., 0., 0.,  ..., 0., 0., 0.],
[0., 0., 0.,  ..., 0., 0., 0.],
...,
[0., 0., 0.,  ..., 0., 0., 0.],
[0., 0., 0.,  ..., 0., 0., 0.],
[0., 0., 0.,  ..., 0., 0., 0.]]]), 5)
torch.Size([1, 32, 32])

# 得到一个batch数量的MNIST数据及其对应的标签
batch_data, batch_label = next(iter(train_loader))
# 查看一个batch数据的形状
print(batch_data.shape)
# 查看一个batch数据对应的标签的形状
print(batch_label.shape)
输出:
torch.Size([16, 1, 32, 32])
torch.Size([16])

一个batch的shape为[N, C, H, W],其中“N”为batch size,“C”为通道数,“H”和“W”和为高度和宽度。假定训练集的batch_size设置为16,所以 “N”等于16;因MNIST数据集中的图像均为单通道灰度图,所以“C”等于1;在图像预处理时,将图像的尺寸Resize为32×32大小,所以这里的“W”和“H”等于32。使用以下代码可以将train_loader中一个batch的数据进行可视化,结果如图2.4所示。

import matplotlib.pyplot as plt
# 得到一个batch数量的MNIST数据及其对应的标签
batch_data, batch_label = next(iter(train_loader))
fig = plt.figure()
for i in range(6):
plt.subplot(2, 3, i+1)
plt.imshow(batch_data[i][0], cmap='gray')
plt.title("Label: {}".format(batch_label[i]))
plt.show()

可以注意到,图1右下角标签值为7的图像数据经过了水平翻转处理。除MNIST数据集之外,其他经典数据集如CIFAR10和CIFAR100等也可以在torchvision.datasets模块中找到,其使用方法和MNIST数据集相同。

图1 MNIST预处理后的数据示例

02、自定义数据集的使用

除了这些经典数据集外,有时还需要根据实际任务使用指定的数据集。自定义的数据集MyDataset类需要继承torch.utils.Dataset抽象类,并实现三个方法,分别是:__init__()方法,实现数据集的初始化;__len__()方法,记录数据集的大小;__getitem__()方法,通过索引获取数据和标签。例如:

import torch
from torch.utils.data import Dataset

class MyDataset(Dataset):
# 初始化方法
    def __init__(self):
# 由3个4维向量组成的模拟数据集
        self.data_list = torch.tensor([[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 0, 1]])
# 对应的标签
        self.label_list = torch.tensor([0, 1, 2])

def __len__(self):
return self.data_list.shape[0]

# 根据索引每次取一个数据
    def __getitem__(self, index):
data = self.data_list[index]
label = self.label_list[index]
return data, label

获取自定义数据集中的数据:

# 获取自定义数据集的数据
dataset = MyDataset()
# 取出第一个数据及其标签
print(dataset[0])
输出:
(tensor([0, 1, 2, 3]), tensor(0))

在torchvision.datasets模块中,还有一个通用的数据集加载器ImageFolder。当数据文件依据标签划分在不同的文件夹中时,例如:

—————data
|—————train
|    |——————class1
|    |       |————class1_data1
|    |       |————class1_data2
|    |       |————class1_···
|    |——————class2
|    |       |————class2_data1
|    |       |————class2_data2
|    |       |————class2_···
|    ···
|—————test

此时,可以使用torchvision.datasets.ImageFolder来直接构造数据集,代码如下:

from torchvision.datasets import ImageFolder
train_dataset = ImageFolder(
root="./data/train/",
transform=transform
)
test_dataset = ImageFolder(
root="./data/test/",
transform=transform
)

03、PyTorch中的数据预处理模块transforms

torchvision包中的transforms模块,提供了对PIL Image对象和Tensor对象的常用处理操作,可以方便地对图像数据进行预处理。导入该模块:

# 导入transforms模块
from torchvision import transforms

常用的操作如下列所示:

# PIL图像调整为给定大小
transforms.Resize(size)
# 依据给定的sizePIL图像中心裁剪
transforms.CenterCrop(size)
# PIL图像上随机裁剪出给定大小
transforms.RandomCrop(size)
# PIL图像裁剪为随机大小和宽高比,然后resize到给定大小
transforms.RandomResizedCrop(size)
# PIL图像依概率p水平翻转,p默认值为0.5
transforms.RandomHorizontalFlip(p)
# PIL图像四周使用fill值进行边界填充,填充像素个数为padding
transforms.Pad(padding, fill)
# PIL图像进行高斯模糊
transforms.GaussianBlur(kernel_size, sigma)
# 调整PIL图像的亮度、对比度、饱和度、色调
transforms.ColorJitter(brightness, contrast, saturation, hue)
# PIL图像依概率p随即变为灰度图,p默认值为0.5
transforms.RandomGrayscale(p)
# PIL图像或者ndarray转换为Tensor,并且归一化至[0-1]
transforms.ToTensor()
# 用平均值和标准偏差归一化张量
transforms.Normalize(mean, std)
# Tensor或者ndarray数据转换为PIL图像
transforms.ToPILImage()

如果想要对数据集进行多个预处理操作,可以使用transforms.Compose()函数将这些操作串接起来。例如:

'''
对数据集中的每个图像执行:
1)大小调整至32×32大小,
2)依0.5的概率进行水平翻转,
3)最后将PIL图像变为Tensor数据
'''
transforms.Compose([
transforms.Resize(32),
transforms.RandomHorizontalFlip(0.5),
transforms.ToTensor()
])

更多内容,敬请关注下方图书!

▊《深度学习与人工智能实战

张重生 编著

本书按照知识由浅入深、循序渐进的规律编写而成。内容分为三大部分,第一部分是Python和PyTorch编程基础,介绍常用的函数及其用法;第二部分是初级深度学习算法与技术,含基础卷积神经网络的实现,目标识别、人脸表情识别等实战;第三部分是高级深度学习算法和技术,含孪生神经网络、度量学习、蒸馏学习、目标检测、图像分割、图像生成等技术及实战。本书的附录还提供了常用PyTorch函数速查手册。本书根据深度学习技术的特点,将内容划分为数据准备、神经网络模型实现、损失函数实现、整体训练流程和效果展示五部分。这种章节内容安排方式逻辑清楚,可操作性强、更易理解。

撰  稿  人:杨健亭责任编辑: 李馨馨审  核  人:曹新宇

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
STM32F429IGT6 1 STMicroelectronics High-performance advanced line, Arm Cortex-M4 core with DSP and FPU, 1 Mbyte of Flash memory, 180 MHz CPU, ART Accelerator, Chrom-ART Accelerator, FMC with SDRAM, TFT

ECAD模型

下载ECAD模型
$14.94 查看

相关推荐

电子产业图谱

“工控有得聊”是机械工业出版社“机工工控”“机工通信”品牌旗下专业资讯和服务平台,致力于帮助读者在电气、通信、自动化领域里,紧跟前沿资讯,掌握核心技术,快速提升专业素养。工业知识服务平台,分享热点资讯、精选深度技术文章、发布最新书讯。

微信公众号