Redian新闻
>
如何用深度学习框架 PyTorch 进行数据处理? | Q 福利

如何用深度学习框架 PyTorch 进行数据处理? | Q 福利

公众号新闻

在深度学习处理复杂任务时,数据预处理是至关重要的一环。PyTorch 作为一款热门的深度学习框架,提供了丰富的数据处理工具。通过 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
)
PyTorch 中的
数据预处理模块 transforms

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、叫板苹果,网友不买账:用大炮打蚊子


老便宜了!字节跳动豆包大模型开始营业,一元钱能买125万Tokens,月活用户量达2600万

OpenAI 官宣旗舰模型 GPT-4o,完全免费、无障碍与人交谈!奥特曼:这是我们最好的模型

你也「在看」吗?👇

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
顶刊IJCV 2024!基于概率表征的半监督对比学习框架扩散模型的原理及实现(Pytorch)深度好文|用Python爬取岗位信息,分分钟掌握全网职位动态!深度好文|关于谷歌裁掉整个Python团队这件事,别再乱传了……NUS刘老师1v1科研:使用深度学习进行投资组合优化|收获一作论文与导师推荐信!谷歌Python团队全员被裁——负责内部Python所有基础设施、曾对数亿行代码执行自动重构突发!谷歌 Python 团队全体被裁,急得 PyTorch 之父爆粗哈工大博士PyTorch笔记火了!!珍惜吃得下睡得着的日子Rust编写的Web开发框架——同时支持Node和PythonPylon框架:在PyTorch中实现带约束的损失函数如何花3400配置一台室内无噪音,48GB显存的深度学习服务器?微软颠覆生产力:Copilot推自定义版,AI PC原生支持PyTorch,奥特曼预告新模型深度学习:教育者和学习者的成长共同体四个问题搞懂银行数据团队如何打造数据体系多模态模型学会打扑克:表现超越GPT-4v,全新强化学习框架是关键法国创业团队抢先OpenAI发布Her!主打公开免费,Pytorch之父马斯克围观【求职战报】全球金融交易平台Deutsche Börse Systems销售运营面试邀约!CENCERT:特斯拉、比亚迪等汽车数据处理4项安全要求检测情况的通报(第一批)谷歌狂喜:JAX性能超越Pytorch、TensorFlow!或成GPU推理训练最快选择抄作业 | 合合信息:AI+Data数据安全体系及数据处理场景风险评估谷歌突破2万亿美元里程碑,却被曝裁掉整个Python团队?PyTorch之父怒批离谱突发!谷歌Python团队解散,PyTorch之父震惊裕锦资产 | 积极探索深度学习和强化学习成立半年就敢踢馆 OpenAI ,首个开源模型不输 GPT-4o,LeCun 、PyTorch 之父齐声叫好!捐贈藏書谷歌裁掉整个 Python 团队!PyTorch 创始人急得直骂人:“WTF!核心语言团队无可替换”一幅草图 ---- 童年的乐园买东西的时候讨价还价的乐趣投资房地产与“劏房”Pytorch高频使用代码集锦今日arXiv最热大模型论文:首个面向AI的python编程框架,提升大模型编程能力新思路Fedora Linux 40版本发布:GNOME桌面更新至46版,首次自带PyTorchYYDS!哈工大博士的PyTorch笔记火了!!强化学习第十三篇:使用深度学习解决迷宫问题,完整步骤和代码
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。