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

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

3天内不再提示

利用 Python 和 PyTorch 处理面向对象的数据集(2)) :创建数据集对象

马占云 来源:emsthe 作者:emsthe 2022-08-02 17:35 次阅读

本篇是利用 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/

可迭代对象的重要性

训练期间,将向模型提供多批次样本。可迭代的 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) + '\n')        

输入 [ ]:

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

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] 表示整数值。

poYBAGGYHoaALC2hAAKp5WYBQEk586.png

使用 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 - 将张量归一化

如需了解后续步骤,敬请期待本系列的第 3 部分。

审核编辑 黄昊宇

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

    关注

    55

    文章

    4779

    浏览量

    84440
  • 数据集
    +关注

    关注

    4

    文章

    1205

    浏览量

    24635
  • pytorch
    +关注

    关注

    2

    文章

    803

    浏览量

    13142
收藏 人收藏

    评论

    相关推荐

    Python面向对象编程详解

    一般编程可分为面向过程编程,和面向对象编程。Python面向对象编程,与Java的
    发表于 09-04 16:35 522次阅读
    <b class='flag-5'>Python</b>的<b class='flag-5'>面向</b><b class='flag-5'>对象</b>编程详解

    3分钟看懂Python面向对象

    Python虽然是解释型语言,但从设计之初就已经是一门面向对象的语言,对于Python来说一切皆为对象。正因为如此,在
    发表于 06-08 14:20

    pandas对babynames数据的简单处理

    利用Python进行数据分析——第二章 引言(2):利用pandas对babynames数据
    发表于 08-09 12:58

    LabVIEW面向对象的ActorFramework(1)

    ` 本帖最后由 bollworm 于 2020-2-10 14:54 编辑 本系列文章主要阐述以下几个问题:(1)什么是面向对象编程?(2)为什么要学习
    发表于 02-10 14:09

    基于数据对象平均离群因子的离群点选择算法

    基于数据对象平均离群因子的离群点选择算法_朱付保
    发表于 01-03 17:41 0次下载

    详谈Python数据模型和对象模型

    Python官方文档说法是“Python数据模型”,大多数Python书籍作者说法是“Python对象
    的头像 发表于 02-10 15:59 2522次阅读
    详谈<b class='flag-5'>Python</b>的<b class='flag-5'>数据</b>模型和<b class='flag-5'>对象</b>模型

    基于面向对象概念格的卸掉判定定理

    集判定定理,进而得到了新的可辨识属性和可辨识属性矩阵,借助布尔逻辑公式转换给岀了约简计算方法。提岀的方法可以避免计算所有面向对象的形式概念及面向属性的所有形式概念。另外,提岀了
    发表于 06-17 14:31 3次下载

    利用PythonPyTorch处理面向对象数据

    本篇是利用 PythonPyTorch 处理面向对象
    的头像 发表于 08-25 15:30 2953次阅读

    利用PythonPyTorch处理面向对象数据(1)

    在本文中,我们将提供一种高效方法,用于完成数据的交互、组织以及最终变换(预处理)。随后,我们将讲解如何在训练过程中正确地把数据输入给模型。PyTorch 框架将帮助我们实现此目标,我们
    的头像 发表于 08-02 08:03 653次阅读

    如何利用Dataloder来处理加载数据

    Pytorch中,torch.utils.data中的Dataset与DataLoader是处理数据的两个函数,用来处理加载
    的头像 发表于 02-24 10:42 564次阅读
    如何<b class='flag-5'>利用</b>Dataloder来<b class='flag-5'>处理</b>加载<b class='flag-5'>数据</b><b class='flag-5'>集</b>

    Python中的类和对象详解

    Python 是一种面向对象的编程语言,它支持类和对象。类是一种用户自定义的数据类型,用于定义对象
    的头像 发表于 04-20 16:53 1051次阅读

    PyTorch教程3.2之面向对象的设计实现

    电子发烧友网站提供《PyTorch教程3.2之面向对象的设计实现.pdf》资料免费下载
    发表于 06-05 15:48 0次下载
    <b class='flag-5'>PyTorch</b>教程3.2之<b class='flag-5'>面向</b><b class='flag-5'>对象</b>的设计实现

    PyTorch教程14.6之对象检测数据

    电子发烧友网站提供《PyTorch教程14.6之对象检测数据.pdf》资料免费下载
    发表于 06-05 11:23 0次下载
    <b class='flag-5'>PyTorch</b>教程14.6之<b class='flag-5'>对象</b>检测<b class='flag-5'>数据</b><b class='flag-5'>集</b>

    PyTorch教程-14.6. 对象检测数据

    14.6. 对象检测数据¶ Colab [火炬]在 Colab 中打开笔记本 Colab [mxnet] Open the notebook in Colab Colab [jax
    的头像 发表于 06-05 15:44 435次阅读
    <b class='flag-5'>PyTorch</b>教程-14.6. <b class='flag-5'>对象</b>检测<b class='flag-5'>数据</b><b class='flag-5'>集</b>

    PyTorch如何训练自己的数据

    PyTorch是一个广泛使用的深度学习框架,它以其灵活性、易用性和强大的动态图特性而闻名。在训练深度学习模型时,数据是不可或缺的组成部分。然而,很多时候,我们可能需要使用自己的数据
    的头像 发表于 07-02 14:09 1308次阅读