0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用Python和PyTorch处理面向对象的数据集

YCqV_FPGA_EETre 来源:XILINX开发者社区 作者:赛灵思开发者 2021-08-25 15:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本篇是利用 Python 和 PyTorch 处理面向对象的数据集系列博客的第 2 篇。

如需阅读第 1 篇:原始数据和数据集,请参阅此处。

我们在第 1 部分中已定义 MyDataset 类,现在,让我们来例化 MyDataset 对象

此可迭代对象是与原始数据交互的接口,在整个训练过程中都有巨大作用。

第 2 部分:创建数据集对象

■输入 [9]:

mydataset = MyDataset(isValSet_bool = None, raw_data_path = raw_data_path, norm = False, resize = True, newsize = (64, 64))

以下是该对象的一些使用示例:

■输入 [10]:

# 对象操作示例。

# 此操作用于调用 method __getitem__ 并从第 6 个样本获取标签

mydataset[6][1]

■输出 [10]:

0

■输入 [11]:

# 此操作用于在类声明后打印注释

MyDataset.__doc__

■输出 [11]:

‘Interface class to raw data, providing the total number of samples in the dataset and a preprocessed item’

■输入 [12]:

# 此操作用于调用 method __len__

len(mydataset)

■输出 [12]:

49100

■输入 [13]:

# 此操作用于触发 method __str__

print(mydataset)

原始数据路径为 。/raw_data/data_images/《raw samples》

可迭代对象的重要性

训练期间,将向模型提供多批次样本。可迭代的 mydataset 是获得高级轻量代码的关键。

以下提供了可迭代对象的 2 个使用示例。

示例 1:

我们可以直接获取第 3 个样本张量:

■输入 [14]:

mydataset.__getitem__(3)[0].shape

■输出 [14]:

torch.Size([3, 64, 64])

与以下操作作用相同

■输入 [15]:

mydataset[3][0].shape

■输出 [15]:

torch.Size([3, 64, 64])

示例 2:

我们可以对文件夹中的图像进行解析,并移除黑白图像:

■输入 [ ]:

# 数据集访问示例:创建 1 个包含标签的新文件,移除黑白图像

if os.path.exists(raw_data_path + ‘/’+ “labels_new.txt”):

os.remove(raw_data_path + ‘/’+ “labels_new.txt”)

with open(raw_data_path + ‘/’+ “labels_new.txt”, “a”) as myfile:

for item, info in mydataset:

if item != None:

if item.shape[0]==1:

# os.remove(raw_data_path + ‘/’ + info.SampleName)

print(‘C = {}; H = {}; W = {}; info = {}’.format(item.shape[0], item.shape[1], item.shape[2], info))

else:

#print(info.SampleName + ‘ ’ + str(info.SampleLabel))

myfile.write(info.SampleName + ‘ ’ + str(info.SampleLabel) + ‘ ’)

■输入 [ ]:

# 查找具有非期望格式的样本

with open(raw_data_path + ‘/’+ “labels.txt”, “a”) as myfile:

for item, info in mydataset:

if item != None:

if item.shape[0]!=3:

# os.remove(raw_data_path + ‘/’ + info.SampleName)

print(‘C = {}; H = {}; W = {}; info = {}’.format(item.shape[0], item.shape[1], item.shape[2], info))

修改标签文件后,请务必更新缓存:

■输入 [ ]:

if os.path.exists(raw_data_path + ‘/’+ “labels_new.txt”):

os.rename(raw_data_path + ‘/’+ “labels.txt”, raw_data_path + ‘/’+ “labels_orig.txt”)

os.rename(raw_data_path + ‘/’+ “labels_new.txt”, raw_data_path + ‘/’+ “labels.txt”)

@functools.lru_cache(1)

def getSampleInfoList(raw_data_path):

sample_list = []

with open(str(raw_data_path) + ‘/labels.txt’, “r”) as f:

reader = csv.reader(f, delimiter = ‘ ’)

for i, row in enumerate(reader):

imgname = row[0]

label = int(row[1])

sample_list.append(DataInfoTuple(imgname, label))

sample_list.sort(reverse=False, key=myFunc)

return sample_list

del mydataset

mydataset = MyDataset(isValSet_bool = None, raw_data_path = ‘。./。./raw_data/data_images’, norm = False)

len(mydataset)

您可通过以下链接阅读了解有关 PyTorch 中的可迭代数据库的更多信息:

https://pytorch.org/docs/stable/data.html

归一化

应对所有样本张量计算平均值和标准差。

如果数据集较小,可以尝试在内存中对其进行直接操作:使用 torch.stack 即可创建 1 个包含所有样本张量的栈。

可迭代对象 mydataset 支持简洁精美的代码。

使用“view”即可保留 R、G 和 B 这 3 个通道,并将其余所有维度合并为 1 个维度。

使用“mean”即可计算维度 1 的每个通道的平均值。

请参阅附件中有关 dim 使用的说明。

■输入 [16]:

imgs = torch.stack([img_t for img_t, _ in mydataset], dim = 3)

■输入 [17]:

#im_mean = imgs.view(3, -1).mean(dim=1).tolist()

im_mean = imgs.view(3, -1).mean(dim=1)

im_mean

■输出 [17]:

tensor([0.4735, 0.4502, 0.4002])

■输入 [18]:

im_std = imgs.view(3, -1).std(dim=1).tolist()

im_std

■输出 [18]:

[0.28131285309791565, 0.27447444200515747, 0.2874436378479004]

■输入 [19]:

normalize = transforms.Normalize(mean=[0.4735, 0.4502, 0.4002], std=[0.28131, 0.27447, 0.28744])

# free memory

del imgs

下面,我们将再次构建数据集对象,但这次将对此对象进行归一化:

■输入 [21]:

mydataset = MyDataset(isValSet_bool = None, raw_data_path = raw_data_path, norm = True, resize = True, newsize = (64, 64))

由于采用了归一化,因此张量值被转换至范围 0..1 之内,并进行剪切操作。

■输入 [22]:

original = Image.open(‘。./。./raw_data/data_images/img_00009111.JPEG’)

fig, axs = plt.subplots(1, 2, figsize=(10, 3))

axs[0].set_title(‘clipped tensor’)

axs[0].imshow(mydataset[5][0].permute(1,2,0))

axs[1].set_title(‘original PIL image’)

axs[1].imshow(original)

plt.show()

将输入数据剪切到含 RGB 数据的 imshow 的有效范围内,以 [0..1] 表示浮点值,或者以 [0..255] 表示整数值。

使用 torchvision.transforms

进行预处理

现在,我们已经创建了自己的变换函数或对象(原本用作为加速学习曲线的练习),我建议使用 Torch 模块 torchvision.transforms:

“此模块定义了一组可组合式类函数对象,这些对象可作为实参传递到数据集(如 torchvision.CIFAR10),并在加载数据后 __getitem__ 返回数据之前,对数据执行变换”。

以下列出了可能的变换:

■输入 [23]:

from torchvision import transforms

dir(transforms)

■输出 [23]:

[‘CenterCrop’,

‘ColorJitter’,

‘Compose’,

‘FiveCrop’,

‘Grayscale’,

‘Lambda’,

LinearTransformation’,

‘Normalize’,

‘Pad’,

‘RandomAffine’,

‘RandomApply’,

‘RandomChoice’,

‘RandomCrop’,

‘RandomErasing’,

‘RandomGrayscale’,

‘RandomHorizontalFlip’,

‘RandomOrder’,

‘RandomPerspective’,

‘RandomResizedCrop’,

‘RandomRotation’,

‘RandomSizedCrop’,

‘RandomVerticalFlip’,

‘Resize’,

‘Scale’,

‘TenCrop’,

‘ToPILImage’,

‘ToTensor’,

‘__builtins__’,

‘__cached__’,

‘__doc__’,

‘__file__’,

‘__loader__’,

‘__name__’,

‘__package__’,

‘__path__’,

‘__spec__’,

‘functional’,

‘transforms’]

在此示例中,我们使用变换来执行了以下操作:

1) ToTensor - 从 PIL 图像转换为张量,并将输出格式定义为 CxHxW

2) Normalize - 将张量归一化

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7364

    浏览量

    95167
  • python
    +关注

    关注

    59

    文章

    4892

    浏览量

    90428
  • pytorch
    +关注

    关注

    2

    文章

    813

    浏览量

    14954

原文标题:开发者分享 | 利用 Python 和 PyTorch 处理面向对象的数据集 - 2:创建数据集对象

文章出处:【微信号:FPGA-EETrend,微信公众号:FPGA开发圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    AI Ceph 分布式存储教程资料大模型学习资料2026

    在人工智能的浪潮中,算力、算法与数据被誉为三驾马车。然而,随着大模型(LLM)参数量突破万亿级别,数据规模膨胀至 PB 乃至 EB 级别,传统的存储架构已难以支撑这场算力竞赛的“粮草”需求
    发表于 05-01 17:35

    Python AI 数字化实战:从 Pandas 自动化到 DeepSeek “星逻系统”开发,无密

    技术优化的角度,快速上手必须学会“数据类型降级”。例如,将Int64降为Int32,或将Object类型(底层是昂贵的Python字符串对象指针)转化为Categorical(分类类型)。在底层
    发表于 04-30 13:43

    Python全栈一课通(470)(12.96 GB)-网盘资源下载

    只懂单一节点的“螺丝钉”,往往是最先被优化、被降薪的群体。(看讠果aixuetang。xyz) 如果将《470吃透 Python 全栈:Web 开发、接口、爬虫、自动化全包含》置于经济学的显微镜下,它
    发表于 04-19 16:30

    [VirtualLab] 使用Python进行跨平台参数扫描

    摘要 VirtualLab Fusion允许外部访问其建模技术、求解器和结果。这有助于应用其他数据处理或优化工具来进一步研究光学模拟。在本示例中,我们演示如何使用Python脚本运行参数扫描,以及
    发表于 03-31 09:36

    PyTorch 中RuntimeError分析

    ? 错误原因 这个 RuntimeError 是因为在 PyTorch 中,upsample_nearest2d_out_frame(最近邻2D上采样)操作尚未对 BFloat16 数据类型提供
    发表于 03-06 06:02

    1688 商品详情 API 调用与数据解析 Python 实战

    你想要的是 1688 商品详情 API 的 Python 调用与数据解析实战方案,核心是完成 API 凭证配置、接口请求(含签名)、响应数据解析、异常处理 的全流程落地,我会提供可直接
    的头像 发表于 02-10 11:23 511次阅读

    Pytorch 与 Visionfive2 兼容吗?

    Pytorch 与 Visionfive2 兼容吗? $ pip3 install torch torchvision torchaudio --index-url https
    发表于 02-06 08:28

    如何使用Python读取不间断数据,并将其传输到LabVIEW进行处理?

    使用Python读取Count,如何将读取到的数据传输至Labview;传输过程中Python要保持读取的动作,不能停止。
    发表于 01-23 11:09

    PYQT 应用程序框架及开发工具

    大家好,本团队此次分享的内容为开发过程中使用到的PYQT 应用程序框架及开发工具。 pYqt 是一个多平台的 python 图形用户界面应用程序框架,由于其面向对象、 易扩展(可实现组件编程等
    发表于 10-29 07:15

    基于蜂鸟E203架构的指令K扩展

    扩展指令架构(RISC-V ISA)的K扩展。 K扩展是一种可选的指令扩展,它增加了一些向量和矩阵操作的指令。这些指令可以利用硬件并行性,高效地处理大量
    发表于 10-21 09:38

    AI Cube如何导入数据

    我从在线平台标注完并且下载了数据,也按照ai cube的要求修改了文件夹名称,但是导入提示 不知道是什么原因,我该怎么办? 以下是我修改后的文件夹目录
    发表于 08-11 08:12

    云训练平台数据过大无法下载数据至本地怎么解决?

    起因是现在平台限制了图片数量,想要本地训练下载数据时发现只会跳出网络异常的错误,请问这有什么解决办法?
    发表于 07-22 06:03

    使用AICube导入数据点创建后提示数据不合法怎么处理

    重现步骤 data目录下 labels.txt只有英文 **错误日志** 但是使用示例的数据可以完成训练并部署
    发表于 06-24 06:07

    数据下载失败的原因?

    数据下载失败什么原因太大了吗,小的可以下载,想把大的下载去本地训练报错网络错误 大的数据多大?数据量有多少?
    发表于 06-18 07:04

    跟老齐学Python:从入门到精通

    本帖最后由 yuu_cool 于 2025-6-3 16:52 编辑 本资料是面向编程零基础读者的Python 入门教程,内容涵盖了Python 的基础知识和初步应用。以比较轻快的风格,向零基
    发表于 06-03 16:10