中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PyTorch中加載數據集的示例分析

發布時間:2021-06-04 15:06:52 來源:億速云 閱讀:169 作者:小新 欄目:開發技術

小編給大家分享一下PyTorch中加載數據集的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

數據預處理在解決深度學習問題的過程中,往往需要花費大量的時間和精力。 數據處理的質量對訓練神經網絡來說十分重要,良好的數據處理不僅會加速模型訓練, 更會提高模型性能。為解決這一問題,PyTorch提供了幾個高效便捷的工具, 以便使用者進行數據處理或增強等操作,同時可通過并行化加速數據加載。

數據集存放大致有以下兩種方式:

(1)所有數據集放在一個目錄下,文件名上附有標簽名,數據集存放格式如下: root/cat_dog/cat.01.jpg

root/cat_dog/cat.02.jpg

........................

root/cat_dog/dog.01.jpg

root/cat_dog/dog.02.jpg

......................

(2)不同類別的數據集放在不同目錄下,目錄名就是標簽,數據集存放格式如下:

root/ants/xxx.png

root/ants/xxy.jpeg

root/ants/xxz.png

................

root/bees/123.jpg

root/bees/nsdf3.png

root/bees/asd932_.png

..................

1.1 對第1種數據集的處理步驟

(1)生成包含各文件名的列表(List)

(2)定義Dataset的一個子類,該子類需要繼承Dataset類,查看Dataset類的源碼

(3)重寫父類Dataset中的兩個魔法方法: 一個是: __lent__(self),其功能是len(Dataset),返回Dataset的樣本數。 另一個是__getitem__(self,index),其功能假設索引為i,使Dataset[i]返回第i個樣本。

(4)使用torch.utils.data.DataLoader加載數據集Dataset.

1.2 實例詳解

以下以cat-dog數據集為例,說明如何實現自定義數據集的加載。

1.2.1 數據集結構

所有數據集在cat-dog目錄下:

.\cat_dog\cat.01.jpg

.\cat_dog\cat.02.jpg

.\cat_dog\cat.03.jpg

....................

.\cat_dog\dog.01.jpg

.\cat_dog\dog.02.jpg

....................

1.2.2 導入需要用到的模塊

from torch.utils.data import DataLoader,Dataset
from skimage import io,transform
import matplotlib.pyplot as plt
import oimport torch
from torchvision import transforms, utils
from PIL import Image
import pandas as pd
import numpy as np
#過濾警告信息
import warnings
warnings.filterwarnings("ignore")

1.2.3定義加載自定義數據的類

class MyDataset(Dataset): #繼承Dataset
 def __init__(self, path_dir, transform=None): #初始化一些屬性
  self.path_dir = path_dir #文件路徑,如'.\data\cat-dog'
  self.transform = transform #對圖形進行處理,如標準化、截取、轉換等
  self.images = os.listdir(self.path_dir)#把路徑下的所有文件放在一個列表中
 
 def __len__(self):#返回整個數據集的大小
  return len(self.images)
 
 def __getitem__(self,index):#根據索引index返回圖像及標簽
  image_index = self.images[index]#根據索引獲取圖像文件名稱
  img_path = os.path.join(self.path_dir, image_index)#獲取圖像的路徑或目錄
  img = Image.open(img_path).convert('RGB')# 讀取圖像
    
  # 根據目錄名稱獲取圖像標簽(cat或dog)
  label = img_path.split('\\')[-1].split('.')[0]
  #把字符轉換為數字cat-0,dog-1
  label = 1 if 'dog' in label else 0
  
  if self.transform is not None:
   img = self.transform(img)
  return img,label

1.2.4 實例化類

dataset = MyDataset('.\data\cat-dog',transform=None)
img, label = dataset[0] #將啟動魔法方法__getitem__(0)
print(type(img))
<class 'PIL.Image.Image'>

1.2.5 查看圖像形狀

i=1
for img, label in dataset:
    if i
img的形狀(500, 374),label的值0

img的形狀(300, 280),label的值0

img的形狀(489, 499),label的值0

img的形狀(431, 410),label的值0

img的形狀(300, 224),label的值0

從上面返回樣本的形狀來看:

(1)每張圖片的大小不一樣,如果需要取batch訓練的神經網絡來說很不友好。

(2)返回樣本的數值較大,未歸一化至[-1, 1]

為此需要對img進行轉換,如何轉換?只要使用torchvision中的transforms即可

1.2.6 對圖像數據進行處理

這里使用torchvision中的transforms模塊

from torchvision import transforms as T
transform = T.Compose([
 T.Resize(224), # 縮放圖片(Image),保持長寬比不變,最短邊為224像素
 T.CenterCrop(224), # 從圖片中間切出224*224的圖片
 T.ToTensor(), # 將圖片(Image)轉成Tensor,歸一化至[0, 1]
 T.Normalize(mean=[.5, .5, .5], std=[.5, .5, .5]) # 標準化至[-1, 1],規定均值和標準差
])

1.2.7查看處理后的數據

dataset = MyDataset('.\data\cat-dog',transform=transform)
for img, label in dataset: 
 print("圖像img的形狀{},標簽label的值{}".format(img.shape, label))
 print("圖像數據預處理后:\n",img)
 break

圖像img的形狀torch.Size([3, 224, 224]),標簽label的值0

圖像數據預處理后:

tensor([[[ 0.9059, 0.9137, 0.9137, ..., 0.9451, 0.9451, 0.9451],

[ 0.9059, 0.9137, 0.9137, ..., 0.9451, 0.9451, 0.9451],

[ 0.9059, 0.9137, 0.9137, ..., 0.9529, 0.9529, 0.9529],

...,

[-0.4824, -0.5294, -0.5373, ..., -0.9216, -0.9294, -0.9451],

[-0.4980, -0.5529, -0.5608, ..., -0.9294, -0.9373, -0.9529],

[-0.4980, -0.5529, -0.5686, ..., -0.9529, -0.9608, -0.9608]],

[[ 0.5686, 0.5765, 0.5765, ..., 0.7961, 0.7882, 0.7882],

[ 0.5686, 0.5765, 0.5765, ..., 0.7961, 0.7882, 0.7882],

[ 0.5686, 0.5765, 0.5765, ..., 0.8039, 0.7961, 0.7961],

...,

[-0.6078, -0.6471, -0.6549, ..., -0.9137, -0.9216, -0.9373],

[-0.6157, -0.6706, -0.6784, ..., -0.9216, -0.9294, -0.9451],

[-0.6157, -0.6706, -0.6863, ..., -0.9451, -0.9529, -0.9529]],

[[-0.0510, -0.0431, -0.0431, ..., 0.2078, 0.2157, 0.2157],

[-0.0510, -0.0431, -0.0431, ..., 0.2078, 0.2157, 0.2157],

[-0.0510, -0.0431, -0.0431, ..., 0.2157, 0.2235, 0.2235],

...,

[-0.9529, -0.9843, -0.9922, ..., -0.9529, -0.9608, -0.9765],

[-0.9686, -0.9922, -1.0000, ..., -0.9608, -0.9686, -0.9843],

[-0.9686, -0.9922, -1.0000, ..., -0.9843, -0.9922, -0.9922]]])

由此可知,數據已標準化、規范化。

1.2.8對數據集進行批量加載

使用DataLoader模塊,對數據集dataset進行批量加載

#使用DataLoader加載數據
dataloader = DataLoader(dataset,batch_size=4,shuffle=True)
for batch_datas, batch_labels in dataloader:
 print(batch_datas.size(),batch_labels.size())
torch.Size([4, 3, 224, 224]) torch.Size([4])
torch.Size([4, 3, 224, 224]) torch.Size([4])
torch.Size([4, 3, 224, 224]) torch.Size([4])
torch.Size([4, 3, 224, 224]) torch.Size([4])
torch.Size([4, 3, 224, 224]) torch.Size([4])
torch.Size([4, 3, 224, 224]) torch.Size([4])
torch.Size([4, 3, 224, 224]) torch.Size([4])
torch.Size([4, 3, 224, 224]) torch.Size([4])
torch.Size([4, 3, 224, 224]) torch.Size([4])
torch.Size([4, 3, 224, 224]) torch.Size([4])
torch.Size([2, 3, 224, 224]) torch.Size([2])

1.2.9隨機查看一個批次的圖像

import torchvision
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
# 顯示圖像
def imshow(img):
 img = img / 2 + 0.5  # unnormalize
 npimg = img.numpy()
 plt.imshow(np.transpose(npimg, (1, 2, 0)))
 plt.show()
# 隨機獲取部分訓練數據
dataiter = iter(dataloader)
images, labels = dataiter.next()
# 顯示圖像
imshow(torchvision.utils.make_grid(images))
# 打印標簽
print(' '.join('%s' % ["小狗" if labels[j].item()==1 else "小貓" for j in range(4)]))

2 對第2種數據集的處理

處理這種情況比較簡單,可分為2步:

(1)使用datasets.ImageFolder讀取、處理圖像。

(2)使用.data.DataLoader批量加載數據集,示例如下:

import torch
from torchvision import transforms, datasets
data_transform = transforms.Compose([
  transforms.RandomSizedCrop(224),
  transforms.RandomHorizontalFlip(),
  transforms.ToTensor(),
  transforms.Normalize(mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225])
 ])
hymenoptera_dataset = datasets.ImageFolder(root='.\catdog\train',
           transform=data_transform)
dataset_loader = torch.utils.data.DataLoader(hymenoptera_dataset,

看完了這篇文章,相信你對“PyTorch中加載數據集的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

韶关市| 霍城县| 磐安县| 景宁| 全州县| 信宜市| 维西| 高阳县| 恩平市| 张家口市| 会泽县| 东丰县| 菏泽市| 沅陵县| 班玛县| 新晃| 吐鲁番市| 高密市| 延寿县| 宁海县| 沐川县| 绥宁县| 方城县| 西昌市| 白河县| 涟源市| 泰兴市| 吉木萨尔县| 仁布县| 博爱县| 黔东| 剑阁县| 盱眙县| 外汇| 洪江市| 桐城市| 来宾市| 桃园县| 松溪县| 天等县| 隆化县|