日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PyTorch基础(四)-----数据加载和预处理

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch基础(四)-----数据加载和预处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

之前已經簡單講述了PyTorch的Tensor、Autograd、torch.nn和torch.optim包,通過這些我們已經可以簡單的搭建一個網絡模型,但這是不夠的,我們還需要大量的數據,眾所周知,數據是深度學習的靈魂,深度學習的模型是由數據“喂”出來的,這篇我們來講述一下數據的加載和預處理。

  • 首先,我們要引入torch包
import torch torch.__version__

一、數據的加載

PyTorch通過torch.utils.data對一般常用的數據加載進行了封裝,可以很容易地實現多線程數據預讀和批量加載。

1.1 Dataset

Dataset是一個抽象類,為了能夠方便的讀取,需要將要使用的數據包裝為Dataset類。自定義的Dataset類需要繼承它并且實現2個成員方法:

  • 1.__getitem__():該方法定義用索引(0-len(self))獲取一條數據或一個樣本
  • 2.__len__():該方法返回數據集的總長度

下面我們使用Kaggle上的一個競賽bluebook for bulldozers自定義一個數據集,為了方便介紹,我們使用里面的數據字典來做說明

  • 首先,我們需要引用相關的包
from torch.utils.data import Dataset import pandas as pd
  • 自定義一個數據集
#定義一個數據集 class BulldozerDataset(Dataset):""" 數據集演示 """def __init__(self, csv_file):"""實現初始化方法,在初始化的時候將數據讀載入"""self.df=pd.read_csv(csv_file)def __len__(self):'''返回df的長度'''return len(self.df)def __getitem__(self, idx):'''根據 idx 返回一行數據'''return self.df.iloc[idx].SalePrice
  • 至此,我們的數據集已經定義完成了,我們可以實例化一個對象來訪問
ds_demo= BulldozerDataset('median_benchmark.csv')
  • 我們可以直接使用如下命令查看數據集數據
# 前面我們已經實現了__len__方法,所以可以直接使用 len(ds_demo)
  • 使用索引可以直接訪問對應的數據
ds_demo[0]

自定義的數據集已經創建好了,下面我們使用官方提供的數據載入器,讀取數據

1.2 DataLoader

DataLoader為我們提供了對Dataset的讀取操作,常用參數有:batch_size(每個batch的大小)、shuffle(是否進行shuffle操作)、num_workers(加載數據時使用幾個子進程)。下面做一個簡單的演示:

dl = torch.utils.data.DataLoader(ds_demo,batch_size = 10,shuffle = True,num_workers = 0)

DataLoader返回的是一個可迭代對象,我們可以使用迭代器分次獲取數據

idata=iter(dl) print(next(idata))

常見的用法是使用for循環對其進行遍歷

for i, data in enumerate(dl):print(i,data)# 為了節約空間,這里只循環一遍break

至此,我們已經可以通過dataset定義數據集,并使用DataLorder載入和遍歷數據集。

二、torchvision包

torchvision 是PyTorch中專門用來處理圖像的庫,PyTorch官網的安裝教程中最后的pip install torchvision 就是安裝這個包。
torchvision已經預先實現了常用圖像數據集,包括前面使用過的CIFAR-10,ImageNet、COCO、MNIST、LSUN等數據集,可通過torchvision.datasets方便的調用。

  • 這里總結一下torchvision已經預裝的數據集:
數據集名稱
MNIST
COCO
CIFAR-10
ImageNet
Captions
Detection
LSUN
ImageFolder
Imagenet-12
STL10
SVHN
PhotoTour

PyTorch中自帶的數據集由2個上層api提供,分別是torchvision和torchtext

  • torchvision提供了對圖像數據處理的相關數據和api
    • 數據位置:torchvision.datasets;例如:torchvision.datasets.MNIST
  • torchtext提供了對文本數據處理的相關數據和api
    • 數據位置:torchtext.datasets;例如:torchtext.datasets.IMDB

下面我們做一個簡單的演示

  • 首先,我們要引入torchvision包
import torchvision.datasets as datasets trainset = datasets.MNIST(root='./data', # 表示 MNIST 數據的加載的目錄train=True, # 表示是否加載數據庫的訓練集,false的時候加載測試集download=True, # 表示是否自動下載 MNIST 數據集transform=None) # 表示是否需要對數據進行預處理,none為不進行預處理

2.1 torchvision.models

torchvision不僅提供了常用的圖像數據集,而且還提供了一些訓練好的網絡模型,可以加載之后直接使用,或者繼續進行遷移學習。torchvision.models模塊的子模塊中包含以下模型:

網絡模型
AlexNet
VGG
ResNet
SqueezeNet
DenseNet

我們直接可以使用訓練好的模型,當然這個與datasets相同,都是需要從服務器下載的。

  • 首先,我們需要導入torchvision.models
import torchvision.models as models
  • 直接使用
resnet18 = models.resnet18(pretrained=True)

2.2 torchvision.tranforms

transforms 模塊提供了一般的圖像轉換操作類,用作數據處理和數據增強

  • 首先,我們需要引入torchvision.tranforms,然后做一個簡單的演示
from torchvision import transforms as transforms transform = transforms.Compose([transforms.RandomCrop(32, padding=4), #先四周填充0,在把圖像隨機裁剪成32*32transforms.RandomHorizontalFlip(), #圖像一半的概率翻轉,一半的概率不翻轉transforms.RandomRotation((-45,45)), #隨機旋轉transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.229, 0.224, 0.225)), #R,G,B每層的歸一化用到的均值和方差 ])

肯定有人會問:(0.485, 0.456, 0.406), (0.2023, 0.1994, 0.2010) 這幾個數字是什么意思?
官方的這個帖子有詳細的說明: https://discuss.pytorch.org/t/normalization-in-the-mnist-example/457/21 這些都是根據ImageNet訓練的歸一化參數,可以直接使用,我們認為這個是固定值就可以。
到這里,我們已經完成了PyTorch的基本內容介紹。

參考文獻

https://github.com/zergtant/pytorch-handbook/blob/master/chapter2

總結

以上是生活随笔為你收集整理的PyTorch基础(四)-----数据加载和预处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。