如何用深度学习框架 PyTorch 进行数据处理? | Q 福利
在深度学习处理复杂任务时,数据预处理是至关重要的一环。PyTorch 作为一款热门的深度学习框架,提供了丰富的数据处理工具。通过 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 预处理后的数据示例
除了这些经典数据集外,有时还需要根据实际任务使用指定的数据集。自定义的数据集 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
)
torchvision 包中的 transforms 模块,提供了对 PIL Image 对象和 Tensor 对象的常用处理操作,可以方便地对图像数据进行预处理。导入该模块:
# 导入 transforms 模块
from torchvision import transforms
常用的操作如下列所示:
# 将 PIL 图像调整为给定大小
transforms.Resize(size)
# 依据给定的 size 从 PIL 图像中心裁剪
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 函数速查手册。
本书根据深度学习技术的特点,将内容划分为数据准备、神经网络模型实现、损失函数实现、整体训练流程和效果展示五部分。这种章节内容安排方式逻辑清楚,可操作性强、更易理解。
为答谢读者朋友们的支持,「AI 前线」为大家准备了 5 本《深度学习与人工智能实战》纸质书籍。本书深入浅出地讲解了深度学习的相关技术,包括深度学习编程基础、目标分类、目标检测、图像分割、生成对抗网络等。对每种技术,本书均从原理和程序实现两个方面进行讲解。在原理方面,讲解算法和技术的相关背景、主要算法思想和原理;在程序实现方面,从数据准备、神经网络模型实现、损失函数实现、整体训练流程和效果展示五部分对算法的实现进行具体介绍,帮助读者深入了解算法的细节,积累相关实践经验。长按识别下图小程序,参与抽奖活动,由小程序随机抽出 5 位,每人赠送一本书。开奖时间:6 月 3 日 17:00。感谢机械工业出版社对本活动的大力支持!
大模型技术正在引领行业发展创新浪潮。那么,如何让大模型技术与行业深度融合?如何通过大模型技术为各行各业提供更加智能化的解决方案?在金融、法律、医疗、教育、政府等各行业的实践场景中,又有哪些大模型落地经验?「AI 前线」特别为您精选了刚刚结束的 AICon 全球人工智能开发与应用大会上的精彩演讲,并经过嘉宾授权将演讲的精彩 PPT 提供给大家。关注「AI 前线」,回复关键词「行业创新」即可免费获取。
今日荐文
TikTok成立7年,罕见被曝全球大规模裁员!或波及一万人,用户运营团队直接解散
奥特曼昨晚放话也要把大模型价格打下来!微软一夜革新生产力:Copilot 贯穿全场、小模型持续炸街
13分钟颠覆传统电脑!微软Copilot+ PC 抢装GPT-4o、叫板苹果,网友不买账:用大炮打蚊子
你也「在看」吗?👇
微信扫码关注该文公众号作者