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

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

3天内不再提示

如何在训练过程中正确地把数据输入给模型

XILINX开发者社区 来源:XILINX开发者社区 作者:XILINX开发者社区 2021-07-01 10:47 次阅读

机器学习中一个常见问题是判定与数据交互的最佳方式。

在本文中,我们将提供一种高效方法,用于完成数据的交互、组织以及最终变换(预处理)。随后,我们将讲解如何在训练过程中正确地把数据输入给模型。

PyTorch 框架将帮助我们实现此目标,我们还将从头开始编写几个类。PyTorch 可提供更完整的原生类,但创建我们自己的类可帮助我们加速学习。

第 1 部分:原始数据和数据集

首先我们把尚未经过组织的所有样本称为“原始数据”。

把“数据集”定义为现成可用的数据,即含标签以及基本函数接口(以便于使用原始数据信息)的原始数据。

此处我们使用一种简单的原始数据形式:1 个包含图像和标签的文件夹。

但此方法可扩展至任意性质的样本(可以是图片、录音、视频等)以及包含标签的文件。

标签文件中的每一行都用于描述 1 个样本和相关标签,格式如下:

file_sample_1 label1

file_sample_2 label2

file_sample_3 label3

(。。。)

当能够完成一些基本信息查询(已有样本数量、返回特定编号的样本、预处理每个样本等)时,说明我们已从原始数据集创建了 1 个数据集。

此方法基于面向对象编程以及创建用于数据处理的 “类”。

对于一组简单的图像和标签而言,此方法可能看上去略显杀鸡用牛刀(实际上,此用例通常是通过创建分别用于训练、验证和测试的独立文件夹来进行处理的)。但如果要选择标准交互方法,则此方法将来可复用于多种不同用例,以节省时间。

Python 中处理数据

在 Python 中所有一切都是对象:整数、列表、字典都是如此。

构建含标准属性和方法的“数据集”对象的原因多种多样。我认为,代码的精致要求就足以合理化这一选择,但我理解这是品味的问题。可移植性、速度和代码模块化可能是最重要的原因。

在许多示例以及编码书籍中,我发现了面向对象的编码(尤以类为甚)的其它有趣的功能和优势,总结如下:

• 类可提供继承

• 继承可提供复用

• 继承可提供数据类型扩展

• 继承支持多态现象

• 继承是面向对象的编码的特有功能

■输入 [1]:

import torch

from torchvision import transforms

to_tensor = transforms.ToTensor()

from collections import namedtuple

import functools

import copy

import csv

from PIL import Image

from matplotlib import pyplot as plt

import numpy as np

import os

import datetime

import torch.optim as optim

在我们的示例中,所有原始样本都存储在文件夹中。此文件夹的地址在 raw_data_path 变量中声明。

■输入 [2]:

raw_data_path = ‘。/raw_data/data_images’

构建模块

数据集接口需要一些函数和类。数据集本身就是一个对象,因此我们将创建 MyDataset 类来包含所有重要函数和变量。

首先,我们需要读取标签文件,然后可对样本在其原始格式(此处为 PIL 图像)以及最终的张量格式应用某些变换。

我们需要使用以下函数来读取 1 次标签文件,然后创建包含所有样本名称和标签的元组。

内存中缓存可提升性能,但如果标签文件发生更改,请务必更新缓存内容。

■ 输入 [113]:

DataInfoTuple = namedtuple(‘Sample’,‘SampleName, SampleLabel’)

def myFunc(e):

return e.SampleLabel

# in memory caching decorator: ref https://dbader.org/blog/python-memoization

@functools.lru_cache(1)

def getSampleInfoList(raw_data_path):

sample_list = []

with open(str(raw_data_path) + ‘/labels.txt’, mode = ‘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)

# print(“DataInfoTouple: samples list length = {}”.format(len(sample_list)))

return sample_list

如需直接变换 PIL 图像,那么以下类很实用。

该类仅含 1 种方法:resize。resize 方法能够改变 PIL 图像的原始大小,并对其进行重新采样。如需其它预处理(翻转、剪切、旋转等),需在此类种添加方法。

当 PIL 图像完成预处理后,即可将其转换为张量。此外还可对张量执行进一步的处理步骤。

在以下示例种,可以看到这两种变换:

■ 输入 [4]:

class PilTransform():

“”“generic transformation of a pil image”“”

def resize(self, img, **kwargs):

img = img.resize(( kwargs.get(‘width’), kwargs.get(‘height’)), resample=Image.NEAREST)

return img

# creation of the object pil_transform, having all powers inherited by the class PilTransform

pil_transform = PilTransform()

以下是类 PilTransform 的实操示例:

■ 输入 [5]:

path = raw_data_path + “/img_00000600.JPEG”

print(path)

im1 = Image.open(path, mode=‘r’)

plt.imshow(im1)

。/raw_data/data_images/img_00000600.JPEG

■ 输出 [5]:

《matplotlib.image.AxesImage at 0x121046f5588》

■ 输入 [6]:

im2 = pil_transform.resize(im1, width=128, height=128)

# im2.show()

plt.imshow(im2)

■ 输出 [6]:

《matplotlib.image.AxesImage at 0x12104b36358》

最后,我们定义一个类,用于实现与原始数据的交互。

类 MyDataset 主要提供了 2 个方法:

__len__ 可提供原始样本的数量。

__getitem__ 可使对象变为可迭代类型,并按张量格式返回请求的样本(已完成预处理)。

__getitem__ 步骤:

1) 打开来自文件的样本。

2) 按样本的原始格式对其进行预处理。

3) 将样本变换为张量。

4) 以张量格式对样本进行预处理。

此处添加的预处理仅作为示例。

此类可对张量进行归一化(求平均值和标准差),这有助于加速训练过程。

请注意,PIL 图像由范围 0-255 内的整数值组成,而张量则为范围 0-1 内的浮点数矩阵。

该类会返回包含两个元素的列表:在位置 [0] 返回张量,在位置 [1] 返回包含 SampleName 和 SampleLabel 的命名元组。

■ 输入 [109]:

class MyDataset():

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

def __init__(self,

isValSet_bool = None,

raw_data_path = ‘。/’,

SampleInfoList = DataInfoTuple,norm = False,

resize = False,

newsize = (32, 32)

):

self.raw_data_path = raw_data_path

self.SampleInfoList = copy.copy(getSampleInfoList(self.raw_data_path))

self.isValSet_bool = isValSet_bool

self.norm = norm

self.resize = resize

self.newsize = newsize

def __str__(self):

return ‘Path of raw data is ’ + self.raw_data_path + ‘/’ + ‘《raw samples》’

def __len__(self):

return len(self.SampleInfoList)

def __getitem__(self, ndx):

SampleInfoList_tup = self.SampleInfoList[ndx]

filepath = self.raw_data_path + ‘/’ + str(SampleInfoList_tup.SampleName)

if os.path.exists(filepath):

img = Image.open(filepath)

# PIL image preprocess (examples)

#resize

if self.resize:

width, height = img.size

if (width 》= height) & (self.newsize[0] 》= self.newsize[1]):

img = pil_transform.resize(img, width=self.newsize[0], height=self.newsize[1])

elif (width 》= height) & (self.newsize[0] 《 self.newsize[1]):

img = pil_transform.resize(img, width=self.newsize[1], height=self.newsize[0])

elif (width 《 height) & (self.newsize[0] 《= self.newsize[1]):

img = pil_transform.resize(img, width=self.newsize[0], height=self.newsize[1])

elif (width 《 height) & (self.newsize[0] 》 self.newsize[1]):

img = pil_transform.resize(img, width=self.newsize[1], height=self.newsize[0])

else:

print(“ERROR”)

# from pil image to tensor

img_t = to_tensor(img)

# tensor preprocess (examples)

#rotation

ratio = img_t.shape[1]/img_t.shape[2]

if ratio 》 1:

img_t = torch.rot90(img_t, 1, [1, 2])

#normalization requires the knowledge of all tensors

if self.norm:

img_t = normalize(img_t)

#return img_t, SampleInfoList_tup

return img_t, SampleInfoList_tup.SampleLabel

else:

print(‘[WARNING] file {} does not exist’.format(str(SampleInfoList_tup.SampleName)))

return None

编辑:jq

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

    关注

    66

    文章

    8122

    浏览量

    130556
  • 数据集
    +关注

    关注

    4

    文章

    1178

    浏览量

    24349
  • PIL
    PIL
    +关注

    关注

    0

    文章

    18

    浏览量

    8505
  • pytorch
    +关注

    关注

    2

    文章

    761

    浏览量

    12829

原文标题:开发者分享 | 利用 Python 和 PyTorch 处理面向对象的数据集:1. 原始数据和数据集

文章出处:【微信号:gh_2d1c7e2d540e,微信公众号:XILINX开发者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    盘点一下史上最全大语言模型训练中的网络技术

    人工智能的基础设施在大语言模型训练和推理过程中发挥了关键的作用。随着大语言模型规模不断增大,其对计算和通信的需求也在不断增加。高
    的头像 发表于 03-27 17:24 383次阅读
    盘点一下史上最全大语言<b class='flag-5'>模型</b><b class='flag-5'>训练</b>中的网络技术

    【飞腾派4G版免费试用】第三章:抓取图像,手动标注并完成自定义目标检测模型训练和测试

    抓取图像,手动标注并完成自定义目标检测模型训练和测试 在第二章中,我介绍了模型训练的一般过程,其中关键的
    发表于 12-16 10:05

    信息化时代,AI大模型崭露头角

    AI大模型是指在训练过程中使用海量数据和大量计算资源来训练的人工智能模,随着算力、网络、大数据等技术的变革,AI大
    的头像 发表于 12-01 17:24 957次阅读

    如何正确地接线升压器呢?升压器的接线方法

    如何正确地接线升压器呢?升压器的接线方法 升压器是一种用于提高电压的电气设备,广泛应用于各种电力系统、工业生产和科技实验中。正确地接线升压器非常重要,它不仅关系到设备安全稳定运行,还与电力负荷的平衡
    的头像 发表于 11-20 14:44 1265次阅读

    如何正确地使用与维护蓄电池

    电子发烧友网站提供《如何正确地使用与维护蓄电池.doc》资料免费下载
    发表于 11-15 11:22 0次下载
    如何<b class='flag-5'>正确地</b>使用与维护蓄电池

    如何正确地使用与维护蓄电池

    电子发烧友网站提供《如何正确地使用与维护蓄电池.doc》资料免费下载
    发表于 11-15 09:13 0次下载
    如何<b class='flag-5'>正确地</b>使用与维护蓄电池

    模型时代,如何搭建数据的“智能化流水线”?

    “大模型时代,数据为王。”这是部分行业观察者给出的一则判断。当前的AI大模型训练过程中,算法端逐渐向Transformer神经网络“收敛”,算力端依赖于具备大规模并行计算能力的AI服务
    的头像 发表于 10-16 18:01 577次阅读

    大语言模型(LLM)预训练数据集调研分析

    finetune)、rlhf(optional).  State of GPT:大神 Andrej 揭秘 OpenAI 大模型原理和训练过程 。 supervised finetune 一般在 base
    的头像 发表于 09-19 10:00 568次阅读
    大语言<b class='flag-5'>模型</b>(LLM)预<b class='flag-5'>训练</b><b class='flag-5'>数据</b>集调研分析

    关于K210裸机开发模型导入问题

    你好,我用tensorflow训练模型导出后,用ncc工具箱进行转化,转化后的模型导入过程中出现问题: 1、我采用maxipy官方的固件,用micropython导入该
    发表于 09-13 07:34

    模型分布式训练并行技术(一)-概述

    数据并行是最常见的并行形式,因为它很简单。在数据并行训练中,数据集被分割成几个碎片,每个碎片被分配到一个设备上。这相当于沿批次(Batch)维度对
    的头像 发表于 08-24 15:17 656次阅读
    大<b class='flag-5'>模型</b>分布式<b class='flag-5'>训练</b>并行技术(一)-概述

    关于领域大模型-训练Trick&amp;落地的一点思考

    现有大模型在预训练过程中都会加入书籍、论文等数据,那么在领域预训练时这两种数据其实也是必不可少的,主要是因为这些
    的头像 发表于 08-09 11:43 1244次阅读
    关于领域大<b class='flag-5'>模型</b>-<b class='flag-5'>训练</b>Trick&amp;落地的一点思考

    基础模型自监督预训练数据之谜:大量数据究竟是福还是祸?

    。然而,在自监督预训练中,是否数据越多越好?数据增广是否始终有效?华为诺亚方舟实验室与香港科技大学的研究团队近期发现: 主流自监督预训练方法如 Masked Autoencoder (
    的头像 发表于 07-24 16:55 290次阅读
    基础<b class='flag-5'>模型</b>自监督预<b class='flag-5'>训练</b>的<b class='flag-5'>数据</b>之谜:大量<b class='flag-5'>数据</b>究竟是福还是祸?

    State of GPT:大神Andrej揭秘OpenAI大模型原理和训练过程

    因为该模型训练时间明显更长,训练了1.4 万亿标记而不是 3000 亿标记。所以你不应该仅仅通过模型包含的参数数量来判断模型的能力。
    的头像 发表于 05-30 14:34 674次阅读
    State of GPT:大神Andrej揭秘OpenAI大<b class='flag-5'>模型</b>原理和<b class='flag-5'>训练过程</b>

    人工智能中的训练与推理

    ,香蕉图片的标签是香蕉。       通过对初始的神经网络参数不断地优化来让模型变得更准确。可能开始对于20张苹果的照片,只有10张被判断为苹果,对另外10张没有做出正确判断,这时可以通过优化参数让神经网络对20张图片都做出正确
    的头像 发表于 05-16 09:46 1736次阅读
    人工智能中的<b class='flag-5'>训练</b>与推理

    何在Arduino ESP8266和Android应用程序中正确地实现WebSockets?

    出结论,使用 WebSockets 将是最好的方法。现在,我能问你,请给我一些材料/信息,如何开始。我只找到了 MIT App 的发明者( )我想学习正确地,这种通信是如何工作的,以及如何在 Arduino
    发表于 04-28 08:42