0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在訓(xùn)練過程中正確地把數(shù)據(jù)輸入給模型

XILINX開發(fā)者社區(qū) ? 來源:XILINX開發(fā)者社區(qū) ? 作者:XILINX開發(fā)者社區(qū) ? 2021-07-01 10:47 ? 次閱讀

機(jī)器學(xué)習(xí)中一個(gè)常見問題是判定與數(shù)據(jù)交互的最佳方式。

在本文中,我們將提供一種高效方法,用于完成數(shù)據(jù)的交互、組織以及最終變換(預(yù)處理)。隨后,我們將講解如何在訓(xùn)練過程中正確地把數(shù)據(jù)輸入給模型。

PyTorch 框架將幫助我們實(shí)現(xiàn)此目標(biāo),我們還將從頭開始編寫幾個(gè)類。PyTorch 可提供更完整的原生類,但創(chuàng)建我們自己的類可幫助我們加速學(xué)習(xí)。

第 1 部分:原始數(shù)據(jù)和數(shù)據(jù)集

首先我們把尚未經(jīng)過組織的所有樣本稱為“原始數(shù)據(jù)”。

把“數(shù)據(jù)集”定義為現(xiàn)成可用的數(shù)據(jù),即含標(biāo)簽以及基本函數(shù)接口(以便于使用原始數(shù)據(jù)信息)的原始數(shù)據(jù)。

此處我們使用一種簡(jiǎn)單的原始數(shù)據(jù)形式:1 個(gè)包含圖像和標(biāo)簽的文件夾。

但此方法可擴(kuò)展至任意性質(zhì)的樣本(可以是圖片、錄音、視頻等)以及包含標(biāo)簽的文件。

標(biāo)簽文件中的每一行都用于描述 1 個(gè)樣本和相關(guān)標(biāo)簽,格式如下:

file_sample_1 label1

file_sample_2 label2

file_sample_3 label3

(。。。)

當(dāng)能夠完成一些基本信息查詢(已有樣本數(shù)量、返回特定編號(hào)的樣本、預(yù)處理每個(gè)樣本等)時(shí),說明我們已從原始數(shù)據(jù)集創(chuàng)建了 1 個(gè)數(shù)據(jù)集。

此方法基于面向?qū)ο?a href="http://www.wenjunhu.com/v/tag/1315/" target="_blank">編程以及創(chuàng)建用于數(shù)據(jù)處理的 “類”。

對(duì)于一組簡(jiǎn)單的圖像和標(biāo)簽而言,此方法可能看上去略顯殺雞用牛刀(實(shí)際上,此用例通常是通過創(chuàng)建分別用于訓(xùn)練、驗(yàn)證和測(cè)試的獨(dú)立文件夾來進(jìn)行處理的)。但如果要選擇標(biāo)準(zhǔn)交互方法,則此方法將來可復(fù)用于多種不同用例,以節(jié)省時(shí)間。

Python 中處理數(shù)據(jù)

在 Python 中所有一切都是對(duì)象:整數(shù)、列表、字典都是如此。

構(gòu)建含標(biāo)準(zhǔn)屬性和方法的“數(shù)據(jù)集”對(duì)象的原因多種多樣。我認(rèn)為,代碼的精致要求就足以合理化這一選擇,但我理解這是品味的問題。可移植性、速度和代碼模塊化可能是最重要的原因。

在許多示例以及編碼書籍中,我發(fā)現(xiàn)了面向?qū)ο蟮木幋a(尤以類為甚)的其它有趣的功能和優(yōu)勢(shì),總結(jié)如下:

? 類可提供繼承

? 繼承可提供復(fù)用

? 繼承可提供數(shù)據(jù)類型擴(kuò)展

? 繼承支持多態(tài)現(xiàn)象

? 繼承是面向?qū)ο蟮木幋a的特有功能

■輸入 [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

在我們的示例中,所有原始樣本都存儲(chǔ)在文件夾中。此文件夾的地址在 raw_data_path 變量中聲明。

■輸入 [2]:

raw_data_path = ‘。/raw_data/data_images’

構(gòu)建模塊

數(shù)據(jù)集接口需要一些函數(shù)和類。數(shù)據(jù)集本身就是一個(gè)對(duì)象,因此我們將創(chuàng)建 MyDataset 類來包含所有重要函數(shù)和變量。

首先,我們需要讀取標(biāo)簽文件,然后可對(duì)樣本在其原始格式(此處為 PIL 圖像)以及最終的張量格式應(yīng)用某些變換。

我們需要使用以下函數(shù)來讀取 1 次標(biāo)簽文件,然后創(chuàng)建包含所有樣本名稱和標(biāo)簽的元組。

內(nèi)存中緩存可提升性能,但如果標(biāo)簽文件發(fā)生更改,請(qǐng)務(wù)必更新緩存內(nèi)容。

■ 輸入 [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 圖像,那么以下類很實(shí)用。

該類僅含 1 種方法:resize。resize 方法能夠改變 PIL 圖像的原始大小,并對(duì)其進(jìn)行重新采樣。如需其它預(yù)處理(翻轉(zhuǎn)、剪切、旋轉(zhuǎn)等),需在此類種添加方法。

當(dāng) PIL 圖像完成預(yù)處理后,即可將其轉(zhuǎn)換為張量。此外還可對(duì)張量執(zhí)行進(jìn)一步的處理步驟。

在以下示例種,可以看到這兩種變換:

■ 輸入 [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 的實(shí)操示例:

■ 輸入 [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》

最后,我們定義一個(gè)類,用于實(shí)現(xiàn)與原始數(shù)據(jù)的交互。

類 MyDataset 主要提供了 2 個(gè)方法:

__len__ 可提供原始樣本的數(shù)量。

__getitem__ 可使對(duì)象變?yōu)榭傻愋?,并按張量格式返回?qǐng)求的樣本(已完成預(yù)處理)。

__getitem__ 步驟:

1) 打開來自文件的樣本。

2) 按樣本的原始格式對(duì)其進(jìn)行預(yù)處理。

3) 將樣本變換為張量。

4) 以張量格式對(duì)樣本進(jìn)行預(yù)處理。

此處添加的預(yù)處理僅作為示例。

此類可對(duì)張量進(jìn)行歸一化(求平均值和標(biāo)準(zhǔn)差),這有助于加速訓(xùn)練過程。

請(qǐng)注意,PIL 圖像由范圍 0-255 內(nèi)的整數(shù)值組成,而張量則為范圍 0-1 內(nèi)的浮點(diǎn)數(shù)矩陣。

該類會(huì)返回包含兩個(gè)元素的列表:在位置 [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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8493

    瀏覽量

    134170
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1223

    瀏覽量

    25300
  • PIL
    PIL
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    8791
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    809

    瀏覽量

    13787

原文標(biāo)題:開發(fā)者分享 | 利用 Python 和 PyTorch 處理面向?qū)ο蟮臄?shù)據(jù)集:1. 原始數(shù)據(jù)和數(shù)據(jù)集

文章出處:【微信號(hào):gh_2d1c7e2d540e,微信公眾號(hào):XILINX開發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問如何在imx8mplus上部署和運(yùn)行YOLOv5訓(xùn)練模型?

    。我在 yo tflite 中轉(zhuǎn)換模型并嘗試在 tensorflow 腳本上運(yùn)行模型,但它不起作用。 如何在 imx8mplus 上運(yùn)行 YOLOv5 模型? 在 imx8mplus
    發(fā)表于 03-25 07:23

    數(shù)據(jù)標(biāo)注服務(wù)—奠定大模型訓(xùn)練數(shù)據(jù)基石

    數(shù)據(jù)標(biāo)注是大模型訓(xùn)練過程中不可或缺的基礎(chǔ)環(huán)節(jié),其質(zhì)量直接影響著模型的性能表現(xiàn)。在大模型訓(xùn)練中,
    的頭像 發(fā)表于 03-21 10:30 ?504次閱讀

    標(biāo)貝數(shù)據(jù)標(biāo)注服務(wù):奠定大模型訓(xùn)練數(shù)據(jù)基石

    數(shù)據(jù)標(biāo)注是大模型訓(xùn)練過程中不可或缺的基礎(chǔ)環(huán)節(jié),其質(zhì)量直接影響著模型的性能表現(xiàn)。在大模型訓(xùn)練中,
    的頭像 發(fā)表于 03-21 10:27 ?456次閱讀
    標(biāo)貝<b class='flag-5'>數(shù)據(jù)</b>標(biāo)注服務(wù):奠定大<b class='flag-5'>模型</b><b class='flag-5'>訓(xùn)練</b>的<b class='flag-5'>數(shù)據(jù)</b>基石

    騰訊公布大語(yǔ)言模型訓(xùn)練新專利

    大語(yǔ)言模型訓(xùn)練過程中引入第一摘要文本和第二摘要文本,為模型提供了更為豐富的學(xué)習(xí)信息。這兩個(gè)摘要文本在信息量上存在差異,且第一摘要文本中既包含正確語(yǔ)句也包含錯(cuò)誤語(yǔ)句。這一設(shè)計(jì)使得
    的頭像 發(fā)表于 02-10 09:37 ?360次閱讀

    GPU是如何訓(xùn)練AI大模型

    在AI模型訓(xùn)練過程中,大量的計(jì)算工作集中在矩陣乘法、向量加法和激活函數(shù)等運(yùn)算上。這些運(yùn)算正是GPU所擅長(zhǎng)的。接下來,AI部落小編帶您了解GPU是如何訓(xùn)練AI大模型的。
    的頭像 發(fā)表于 12-19 17:54 ?659次閱讀

    如何訓(xùn)練ai大模型

    源 :從可靠的來源獲取數(shù)據(jù),如公開數(shù)據(jù)集、內(nèi)部數(shù)據(jù)庫(kù)或第三方數(shù)據(jù)提供商。 2. 數(shù)據(jù)清洗 去除重復(fù)數(shù)據(jù)
    的頭像 發(fā)表于 10-17 18:17 ?2479次閱讀

    何在應(yīng)用中正確設(shè)置THVD1505和SN65HVD888

    電子發(fā)燒友網(wǎng)站提供《如何在應(yīng)用中正確設(shè)置THVD1505和SN65HVD888.pdf》資料免費(fèi)下載
    發(fā)表于 09-18 10:25 ?0次下載
    如<b class='flag-5'>何在</b>應(yīng)用<b class='flag-5'>中正確</b>設(shè)置THVD1505和SN65HVD888

    FP8模型訓(xùn)練中Debug優(yōu)化思路

    目前,市場(chǎng)上許多公司都積極開展基于 FP8 的大模型訓(xùn)練,以提高計(jì)算效率和性能。在此,我們整理并總結(jié)了客戶及 NVIDIA 技術(shù)團(tuán)隊(duì)在 FP8 模型訓(xùn)練過程中的 debug 思路和方法
    的頭像 發(fā)表于 09-06 14:36 ?791次閱讀
    FP8<b class='flag-5'>模型</b><b class='flag-5'>訓(xùn)練</b>中Debug優(yōu)化思路

    BP神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)和訓(xùn)練過程

    網(wǎng)絡(luò)結(jié)構(gòu),通過誤差反向傳播算法(Error Backpropagation Algorithm)來訓(xùn)練網(wǎng)絡(luò),實(shí)現(xiàn)對(duì)復(fù)雜問題的學(xué)習(xí)和解決。以下將詳細(xì)闡述BP神經(jīng)網(wǎng)絡(luò)的工作方式,涵蓋其基本原理、訓(xùn)練過程、應(yīng)用實(shí)例以及優(yōu)缺點(diǎn)等多個(gè)方面。
    的頭像 發(fā)表于 07-10 15:07 ?7626次閱讀
    BP神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)和<b class='flag-5'>訓(xùn)練過程</b>

    解讀PyTorch模型訓(xùn)練過程

    PyTorch作為一個(gè)開源的機(jī)器學(xué)習(xí)庫(kù),以其動(dòng)態(tài)計(jì)算圖、易于使用的API和強(qiáng)大的靈活性,在深度學(xué)習(xí)領(lǐng)域得到了廣泛的應(yīng)用。本文將深入解讀PyTorch模型訓(xùn)練的全過程,包括數(shù)據(jù)準(zhǔn)備、
    的頭像 發(fā)表于 07-03 16:07 ?1761次閱讀

    深度學(xué)習(xí)的典型模型訓(xùn)練過程

    深度學(xué)習(xí)作為人工智能領(lǐng)域的一個(gè)重要分支,近年來在圖像識(shí)別、語(yǔ)音識(shí)別、自然語(yǔ)言處理等多個(gè)領(lǐng)域取得了顯著進(jìn)展。其核心在于通過構(gòu)建復(fù)雜的神經(jīng)網(wǎng)絡(luò)模型,從大規(guī)模數(shù)據(jù)中自動(dòng)學(xué)習(xí)并提取特征,進(jìn)而實(shí)現(xiàn)高效準(zhǔn)確的預(yù)測(cè)和分類。本文將深入解讀深度學(xué)習(xí)中的典型
    的頭像 發(fā)表于 07-03 16:06 ?2798次閱讀

    神經(jīng)網(wǎng)絡(luò)前向傳播和反向傳播在神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中的作用

    神經(jīng)網(wǎng)絡(luò)是一種強(qiáng)大的機(jī)器學(xué)習(xí)模型,它通過模擬人腦神經(jīng)元的連接方式來處理復(fù)雜的數(shù)據(jù)。神經(jīng)網(wǎng)絡(luò)的核心是前向傳播和反向傳播算法。本文將詳細(xì)介紹神經(jīng)網(wǎng)絡(luò)的前向傳播和反向傳播的區(qū)別,并探討它們?cè)谏窠?jīng)網(wǎng)絡(luò)訓(xùn)練過程中
    的頭像 發(fā)表于 07-03 11:11 ?2418次閱讀

    CNN模型的基本原理、結(jié)構(gòu)、訓(xùn)練過程及應(yīng)用領(lǐng)域

    CNN模型的基本原理、結(jié)構(gòu)、訓(xùn)練過程以及應(yīng)用領(lǐng)域。 卷積神經(jīng)網(wǎng)絡(luò)的基本原理 1.1 卷積運(yùn)算 卷積運(yùn)算是CNN模型的核心,它是一種數(shù)學(xué)運(yùn)算
    的頭像 發(fā)表于 07-02 15:26 ?5566次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的基本原理、結(jié)構(gòu)及訓(xùn)練過程

    、訓(xùn)練過程以及應(yīng)用場(chǎng)景。 一、卷積神經(jīng)網(wǎng)絡(luò)的基本原理 卷積運(yùn)算 卷積運(yùn)算是卷積神經(jīng)網(wǎng)絡(luò)的核心,它是一種數(shù)學(xué)運(yùn)算,用于提取圖像中的局部特征。卷積運(yùn)算的過程如下: (1)定義卷積核:卷積核是一個(gè)小的矩陣,用于在輸入圖像上滑動(dòng),提取局
    的頭像 發(fā)表于 07-02 14:21 ?4209次閱讀

    深度學(xué)習(xí)模型訓(xùn)練過程詳解

    詳細(xì)介紹深度學(xué)習(xí)模型訓(xùn)練的全過程,包括數(shù)據(jù)預(yù)處理、模型構(gòu)建、損失函數(shù)定義、優(yōu)化算法選擇、訓(xùn)練過程
    的頭像 發(fā)表于 07-01 16:13 ?2477次閱讀

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品