0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

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

利用 Python 和 PyTorch 處理面向?qū)ο蟮臄?shù)據(jù)集(2)) :創(chuàng)建數(shù)據(jù)集對象

馬占云 ? 來源:emsthe ? 作者:emsthe ? 2022-08-02 17:35 ? 次閱讀

本篇是利用 Python 和 PyTorch 處理面向?qū)ο蟮臄?shù)據(jù)集系列博客的第 2 篇。

如需閱讀第 1 篇:原始數(shù)據(jù)和數(shù)據(jù)集,請參閱此處。

我們在第 1 部分中已定義 MyDataset 類,現(xiàn)在,讓我們來例化 MyDataset 對象

此可迭代對象是與原始數(shù)據(jù)交互的接口,在整個訓(xùn)練過程中都有巨大作用。

第 2 部分:創(chuàng)建數(shù)據(jù)集對象

輸入 [9]:

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

以下是該對象的一些使用示例:

輸入 [10]:

# 對象操作示例。

# 此操作用于調(diào)用 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]:

# 此操作用于調(diào)用 method __len__
len(mydataset)

輸出 [12]:

49100

輸入 [13]:

# 此操作用于觸發(fā) method __str__
print(mydataset)
原始數(shù)據(jù)路徑為 ./raw_data/data_images/

可迭代對象的重要性

訓(xùn)練期間,將向模型提供多批次樣本。可迭代的 mydataset 是獲得高級輕量代碼的關(guān)鍵。

以下提供了可迭代對象的 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:

我們可以對文件夾中的圖像進行解析,并移除黑白圖像:

輸入 [ ]:

# 數(shù)據(jù)集訪問示例:創(chuàng)建 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))

修改標簽文件后,請務(wù)必更新緩存:

輸入 [ ]:

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)

您可通過以下鏈接閱讀了解有關(guān) PyTorch 中的可迭代數(shù)據(jù)庫的更多信息https://pytorch.org/docs/stable/data.html

歸一化

應(yīng)對所有樣本張量計算平均值和標準差。

如果數(shù)據(jù)集較小,可以嘗試在內(nèi)存中對其進行直接操作:使用 torch.stack 即可創(chuàng)建 1 個包含所有樣本張量的棧。

可迭代對象 mydataset 支持簡潔精美的代碼。

使用“view”即可保留 R、G 和 B 這 3 個通道,并將其余所有維度合并為 1 個維度。

使用“mean”即可計算維度 1 的每個通道的平均值。

請參閱附件中有關(guān) 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

下面,我們將再次構(gòu)建數(shù)據(jù)集對象,但這次將對此對象進行歸一化:

輸入 [21]:

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

由于采用了歸一化,因此張量值被轉(zhuǎn)換至范圍 0..1 之內(nèi),并進行剪切操作。

輸入 [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()
將輸入數(shù)據(jù)剪切到含 RGB 數(shù)據(jù)的 imshow 的有效范圍內(nèi),以 [0..1] 表示浮點值,或者以 [0..255] 表示整數(shù)值。

poYBAGGYHoaALC2hAAKp5WYBQEk586.png

使用 torchvision.transforms 進行預(yù)處理

現(xiàn)在,我們已經(jīng)創(chuàng)建了自己的變換函數(shù)或?qū)ο螅ㄔ居米鳛榧铀賹W(xué)習(xí)曲線的練習(xí)),我建議使用 Torch 模塊 torchvision.transforms:

“此模塊定義了一組可組合式類函數(shù)對象,這些對象可作為實參傳遞到數(shù)據(jù)集(如 torchvision.CIFAR10),并在加載數(shù)據(jù)后 __getitem__ 返回數(shù)據(jù)之前,對數(shù)據(jù)執(zhí)行變換”。

以下列出了可能的變換:

輸入 [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']

在此示例中,我們使用變換來執(zhí)行了以下操作:

1) ToTensor - 從 PIL 圖像轉(zhuǎn)換為張量,并將輸出格式定義為 CxHxW
2) Normalize - 將張量歸一化

如需了解后續(xù)步驟,敬請期待本系列的第 3 部分。

審核編輯 黃昊宇

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

    關(guān)注

    53

    文章

    4753

    瀏覽量

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

    關(guān)注

    4

    文章

    1197

    瀏覽量

    24538
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    794

    瀏覽量

    13009
收藏 人收藏

    評論

    相關(guān)推薦

    Python面向對象編程詳解

    一般編程可分為面向過程編程,和面向對象編程。Python面向對象編程,與Java的
    發(fā)表于 09-04 16:35 ?452次閱讀
    <b class='flag-5'>Python</b>的<b class='flag-5'>面向</b><b class='flag-5'>對象</b>編程詳解

    3分鐘看懂Python面向對象

    Python雖然是解釋型語言,但從設(shè)計之初就已經(jīng)是一門面向對象的語言,對于Python來說一切皆為對象。正因為如此,在
    發(fā)表于 06-08 14:20

    pandas對babynames數(shù)據(jù)的簡單處理

    利用Python進行數(shù)據(jù)分析——第二章 引言(2):利用pandas對babynames數(shù)據(jù)
    發(fā)表于 08-09 12:58

    LabVIEW面向對象的ActorFramework(1)

    ` 本帖最后由 bollworm 于 2020-2-10 14:54 編輯 本系列文章主要闡述以下幾個問題:(1)什么是面向對象編程?(2)為什么要學(xué)習(xí)
    發(fā)表于 02-10 14:09

    基于數(shù)據(jù)對象平均離群因子的離群點選擇算法

    基于數(shù)據(jù)對象平均離群因子的離群點選擇算法_朱付保
    發(fā)表于 01-03 17:41 ?0次下載

    詳談Python數(shù)據(jù)模型和對象模型

    Python官方文檔說法是“Python數(shù)據(jù)模型”,大多數(shù)Python書籍作者說法是“Python對象
    的頭像 發(fā)表于 02-10 15:59 ?2458次閱讀
    詳談<b class='flag-5'>Python</b>的<b class='flag-5'>數(shù)據(jù)</b>模型和<b class='flag-5'>對象</b>模型

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

    集判定定理,進而得到了新的可辨識屬性和可辨識屬性矩陣,借助布爾邏輯公式轉(zhuǎn)換給岀了約簡計算方法。提岀的方法可以避免計算所有面向對象的形式概念及面向屬性的所有形式概念。另外,提岀了
    發(fā)表于 06-17 14:31 ?3次下載

    利用PythonPyTorch處理面向對象數(shù)據(jù)

    本篇是利用 PythonPyTorch 處理面向對象
    的頭像 發(fā)表于 08-25 15:30 ?2893次閱讀

    利用PythonPyTorch處理面向對象數(shù)據(jù)(1)

    在本文中,我們將提供一種高效方法,用于完成數(shù)據(jù)的交互、組織以及最終變換(預(yù)處理)。隨后,我們將講解如何在訓(xùn)練過程中正確地把數(shù)據(jù)輸入給模型。PyTorch 框架將幫助我們實現(xiàn)此目標,我們
    的頭像 發(fā)表于 08-02 08:03 ?602次閱讀

    如何利用Dataloder來處理加載數(shù)據(jù)

    Pytorch中,torch.utils.data中的Dataset與DataLoader是處理數(shù)據(jù)的兩個函數(shù),用來處理加載
    的頭像 發(fā)表于 02-24 10:42 ?512次閱讀
    如何<b class='flag-5'>利用</b>Dataloder來<b class='flag-5'>處理</b>加載<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>集</b>

    Python中的類和對象詳解

    Python 是一種面向對象的編程語言,它支持類和對象。類是一種用戶自定義的數(shù)據(jù)類型,用于定義對象
    的頭像 發(fā)表于 04-20 16:53 ?963次閱讀

    PyTorch教程3.2之面向對象的設(shè)計實現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程3.2之面向對象的設(shè)計實現(xiàn).pdf》資料免費下載
    發(fā)表于 06-05 15:48 ?0次下載
    <b class='flag-5'>PyTorch</b>教程3.2之<b class='flag-5'>面向</b><b class='flag-5'>對象</b>的設(shè)計實現(xiàn)

    PyTorch教程14.6之對象檢測數(shù)據(jù)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程14.6之對象檢測數(shù)據(jù).pdf》資料免費下載
    發(fā)表于 06-05 11:23 ?0次下載
    <b class='flag-5'>PyTorch</b>教程14.6之<b class='flag-5'>對象</b>檢測<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>集</b>

    PyTorch教程-14.6. 對象檢測數(shù)據(jù)

    14.6. 對象檢測數(shù)據(jù)? Colab [火炬]在 Colab 中打開筆記本 Colab [mxnet] Open the notebook in Colab Colab [jax
    的頭像 發(fā)表于 06-05 15:44 ?385次閱讀
    <b class='flag-5'>PyTorch</b>教程-14.6. <b class='flag-5'>對象</b>檢測<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>集</b>

    PyTorch如何訓(xùn)練自己的數(shù)據(jù)

    PyTorch是一個廣泛使用的深度學(xué)習(xí)框架,它以其靈活性、易用性和強大的動態(tài)圖特性而聞名。在訓(xùn)練深度學(xué)習(xí)模型時,數(shù)據(jù)是不可或缺的組成部分。然而,很多時候,我們可能需要使用自己的數(shù)據(jù)
    的頭像 發(fā)表于 07-02 14:09 ?531次閱讀