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

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

6月前

在深度学习处理复杂任务时,数据预处理是至关重要的一环。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,完全免费、无障碍与人交谈!奥特曼:这是我们最好的模型

你也「在看」吗?👇

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

来源:AI前线

相关新闻

Apache 顶级项目 MXNet 退役!大神李沐创办、亚马逊首选深度学习框架如何从大厂“宠儿”到落入“冷宫”?微服务之间调用的异常应该如何处理?如何用华丽志APP进行时尚品牌研究?7.0新版上线如何花3400配置一台室内无噪音,48GB显存的深度学习服务器?中国“明斯克”号航母烧塌,后续如何处理?紧急生产问题:线上kafka百万消息积压如何处理?一项人工智能法案,为何让硅谷陷入恐慌?| Q福利大模型已经卷到头了,AI 赛道还有哪些新机会?| Q福利藤校近50%录取都是美高?如何用美高优势叩响顶尖美本大门?面对哮喘急性发作时,患者以及家人如何处理?没有阳台怎么晾衣服?设计师该如何处理?【装修干货】内镜下遇到这样的病灶,你会如何处理?(常见又特别)宝宝吐的奶中有黏液,严重吗?如何处理?急诊接诊急性房颤患者,如何进行治疗?乙流如何用药?一表盘点5大药物面对关系中的「分离焦虑」,如何进行调节?后疫情时代,儿童呼吸疾病管理应该如何规范进行?| 秋冬呼吸大咖谈期末考试周诚信问题多发,应该如何避免和处理?缅因州国家公园深度游如何玩?!父亲节首发!免费赠送大龙虾一只!游览波士顿新开高楼——普天寿摩天大楼!大模型如何用因果性?最新《大型语言模型与因果推断在协作中的应用》全面综述新手编剧如何处理剧本结构?面试官:宕机了,Redis 如何避免数据丢失?宕机了,Redis 如何避免数据丢失?如何学习胖东来?
logo
联系我们隐私协议©2024 bendi.news
Bendi新闻
Bendi.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Bendi.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。