pytorch基礎2-數據集與歸一化

專題鏈接:https://blog.csdn.net/qq_33345365/category_12591348.html

本教程翻譯自微軟教程:https://learn.microsoft.com/en-us/training/paths/pytorch-fundamentals/

初次編輯:2024/3/2;最后編輯:2024/3/2


本教程第一篇介紹pytorch基礎和張量操作

這是本教程的第二篇,介紹以下內容:

  1. 數據集與數據加載器
  2. 歸一化

另外本人還有pytorch CV相關的教程,見專題:

https://blog.csdn.net/qq_33345365/category_12578430.html


數據集與數據加載器 Datasets and Dataloaders

處理數據樣本的代碼可能會變得復雜且難以維護。通常希望數據集代碼與模型訓練代碼解耦,以獲得更好的可讀性和模塊化性。PyTorch提供了兩個數據原語:torch.utils.data.DataLoadertorch.utils.data.Dataset,它們使您能夠使用預加載的數據集以及您自己的數據。Dataset存儲樣本及其對應的標簽,而DataLoader則在Dataset周圍包裝了一個可迭代對象,以便輕松訪問樣本。

PyTorch庫提供了許多預加載的樣本數據集(例如FashionMNIST),它們是torch.utils.data.Dataset的子類,并實現了特定于特殊數據的功能。用于模型原型設計(prototyping)和基準測試(benchmark)的樣本包括:

  1. 圖像數據集
  2. 文本數據集
  3. 音頻數據集

加載數據集

此處使用TorchVision來加載Fashion-MNIST數據集。Fashion-MNIST是Zalando的服裝圖像數據集,包含60,000個訓練樣本和10,000個測試樣本。每個樣本包括一個28×28的灰度圖像和一個來自10個類別中的關聯標簽。

  • 每個圖像高度為28個像素,寬度為28個像素,總共有784個像素。
  • 這10個類別告訴圖像是什么類型,例如:T恤/上衣、褲子、套頭衫、連衣裙、包、短靴等。
  • 灰度像素的值介于0到255之間,用于衡量黑白圖像的強度。強度值從白色到黑色遞增。例如:白色的顏色值為0,而黑色的顏色值為255。

我們使用以下參數加載FashionMNIST數據集:

  • root 是存儲訓練/測試數據的路徑。
  • train 指定訓練或測試數據集。
  • download=True 如果數據在root中不可用,則從互聯網下載數據。
  • transformtarget_transform 指定特征和標簽的轉換。

加載訓練和測試數據集的代碼如下所示:

import torch
from torch.utils.data import Dataset
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda
import matplotlib.pyplot as plttraining_data = datasets.FashionMNIST(root="data",train=True,download=True,transform=ToTensor()
)test_data = datasets.FashionMNIST(root="data",train=False,download=True,transform=ToTensor()
)

數據集的迭代與可視化

可以像列表一樣手動索引Datasets: training_data[index]。此處使用matplotlib對訓練數據中的一些樣本進行可視化。代碼如下所示:

labels_map = {0: "T-Shirt",1: "Trouser",2: "Pullover",3: "Dress",4: "Coat",5: "Sandal",6: "Shirt",7: "Sneaker",8: "Bag",9: "Ankle Boot",
}
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3
for i in range(1, cols * rows + 1):sample_idx = torch.randint(len(training_data), size=(1,)).item()img, label = training_data[sample_idx]figure.add_subplot(rows, cols, i)plt.title(labels_map[label])plt.axis("off")plt.imshow(img.squeeze(), cmap="gray")
plt.show()

得到如下圖片:

在這里插入圖片描述

使用數據加載器(DataLoaders)準備自定義數據

Dataset 逐個樣本檢索數據集的特征和標簽。在訓練模型時,通常希望以“minibatch”的形式傳遞樣本,在每個周期重混洗(reshuffle)數據以減少模型過擬合,并使用Python的多進程加速數據檢索。

在機器學習中,需要指定數據集中的特征和標簽。**特征(Feature)**是輸入,**標簽(label)**是輸出。我們訓練特征,然后訓練模型以預測標簽。

  • 特征是圖像像素中的模式。
  • 標簽是10個類別類型:T恤,涼鞋,連衣裙等。

DataLoader是一個可迭代對象,用簡單的API抽象了這種復雜性。為了使用DataLoader,我們需要設置以下參數:

  • data 用于訓練模型的訓練數據,以及用于評估模型的測試數據。
  • batch size 每個批次要處理的記錄數。
  • shuffle 按索引隨機抽取數據樣本。

使用DataLoader處理兩個數據集的代碼如下所示:

from torch.utils.data import DataLoadertrain_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)

使用DataLoader進行迭代

我們已將數據集加載到 DataLoader 中,現在可以根據需要迭代數據集。 下面的每次迭代都會返回一個批次的 train_featurestrain_labels(分別包含 batch_size=64 個特征和標簽)。由于我們指定了 shuffle=True,在遍歷完所有批次后,數據將被混洗(shuffle),以更精細地控制數據加載順序。

展示圖片和標簽的代碼如下所示:

# Display image and label.
train_features, train_labels = next(iter(train_dataloader))
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")
img = train_features[0].squeeze()
label = train_labels[0]
plt.imshow(img, cmap="gray")
plt.show()
label_name = list(labels_map.values())[label]
print(f"Label: {label_name}")

得到圖片:

在這里插入圖片描述

歸一化

標準化是一種常見的數據預處理技術,用于對數據進行縮放或轉換,以確保每個特征都有相等的學習貢獻。例如,灰度圖像中的每個像素的值都介于0和255之間,這些是特征。如果一個像素值為17,另一個像素為197,則像素重要性的分布將不均勻,因為較高的像素值會偏離學習。標準化改變了數據的范圍,而不會扭曲其特征之間的區別。這種預處理是為了避免:

  • 減少預測精度
  • 模型學習困難
  • 特征數據范圍的不利分布

Transforms

數據并不總是以最終處理過的形式呈現,這種形式適合訓練機器學習算法。可以使用transforms來操作數據,使其適合訓練。

所有 TorchVision 數據集都有兩個參數(transform用于修改特征,target_transform用于修改標簽),這些參數接受包含轉換邏輯的可調用對象。torchvision.transforms 模塊提供了幾種常用的轉換。

FashionMNIST 的特征是 PIL 圖像格式,標簽是整數。 對于訓練,需要將特征轉換為歸一化的張量,將標簽轉換為 one-hot 編碼的張量。 為了進行這些轉換,將使用 ToTensorLambda

from torchvision import datasets
from torchvision.transforms import ToTensor, Lambdads = datasets.FashionMNIST(root="data",train=True,download=True,transform=ToTensor(),target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))
)

解釋上述代碼:

ToTensor()

ToTensor 將PIL圖像或NumPy ndarray轉換為FloatTensor,并將圖像的像素強度值縮放到范圍 [0., 1.]內。

Lambda transforms

Lambda transforms 應用任何用戶定義的lambda函數。在這里,我們定義了一個函數來將整數轉換為一個one-hot編碼的張量。它首先創建一個大小為10的零張量(數據集中標簽的數量),然后調用scatter,根據標簽y的索引為其分配值為1。也可以使用torch.nn.functional.one_hot的方式來實現這一點。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714681.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714681.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714681.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

迪杰斯特拉算法的具體應用

fill與memset的區別介紹 例一 #include <iostream> #include <algorithm> using namespace std; const int maxn500; const int INF1000000000; bool isin[maxn]{false}; int G[maxn][maxn]; int path[maxn],rescue[maxn],num[maxn]; int weight[maxn]; int cityn…

【深度學習數學基礎】Hebbian圖(Hebbian Graph)

Hebbian圖&#xff08;Hebbian Graph&#xff09;是一種基于神經科學原理的網絡結構&#xff0c;它受到唐納德赫布&#xff08;Donald Hebb&#xff09;提出的赫布學習規則&#xff08;Hebb’s rule&#xff09;的啟發。赫布學習規則是神經科學中描述神經元之間突觸連接如何通過…

模板方法模式 詳解 設計模式

模板方法模式 模板方法模式是一種行為型設計模式&#xff0c;它定義了一個算法的骨架&#xff0c;將一些步驟延遲到子類中實現。這種模式允許子類在不改變算法結構的情況下重新定義算法的某些步驟。 結構 抽象類&#xff08;Abstract Class&#xff09;&#xff1a;負責給出一…

JavaWeb老杜視頻筆記總結,Servlet-JSP

關于直播 什么時間直播&#xff1f; 晚上8:00到10:00 每周直播幾天&#xff1f; 3天&#xff08;周一、周三、周五&#xff09; 本周比較特殊&#xff1a;周四周五周六三天直播&#xff0c;從下周開始就是一三五直播。 直播什么內容&#xff1f; 從JavaWEB開始。&#xff08…

《深入淺出紅黑樹:一起動手實現自平衡的二叉搜索樹》

一、分析 1. 紅黑樹的性質 紅黑樹是一種自平衡的二叉搜索樹&#xff0c;它具有以下五個性質&#xff1a; &#xff08;1&#xff09;節點是紅色或黑色。 &#xff08;2&#xff09;根節點是黑色。 &#xff08;3&#xff09;所有葉子節點&#xff08;NIL節點&#xff09;是…

探索數據宇宙:深入解析大數據分析與管理技術

?? 歡迎大家來訪Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭?&#xff5e;?? &#x1f31f;&#x1f31f; 歡迎各位親愛的讀者&#xff0c;感謝你們抽出寶貴的時間來閱讀我的文章。 我是Srlua&#xff0c;在這里我會分享我的知識和經驗。&#x…

第六課:NIO簡介

一、傳統BIO的缺點 BIO屬于同步阻塞行IO,在服務器的實現模型為&#xff0c;每一個連接都要對應一個線程。當客戶端有連接請求的時候&#xff0c;服務器端需要啟動一個新的線程與之對應處理&#xff0c;這個模型有很多缺陷。當客戶端不做出進一步IO請求的時候&#xff0c;服務器…

《Spring Security 簡易速速上手小冊》第4章 授權與角色管理(2024 最新版)

文章目錄 4.1 理解授權4.1.1 基礎知識詳解授權的核心授權策略方法級安全動態權限檢查 4.1.2 主要案例&#xff1a;基于角色的頁面訪問控制案例 Demo 4.1.3 拓展案例 1&#xff1a;自定義投票策略案例 Demo測試自定義投票策略 4.1.4 拓展案例 2&#xff1a;使用方法級安全進行細…

【flutter】加載指示器(loading indicator)阻止用戶在某個操作執行期間操作頁面

在Flutter中&#xff0c;通過顯示一個加載指示器&#xff08;loading indicator&#xff09;來阻止用戶在某個操作執行期間操作頁面。以下是一個簡單的示例代碼&#xff0c;演示了按鈕被點擊后執行某操作&#xff0c;在操作完成前顯示加載指示器&#xff0c;阻止用戶操作頁面&a…

c語言數據結構(5)——棧

歡迎來到博主的專欄——C語言數據結構 博主id&#xff1a;代碼小豪 文章目錄 棧棧的順序存儲結構棧的插入空棧的初始化棧的刪除判斷空棧讀取棧頂元素數據 實現順序棧的所有代碼棧的鏈式存儲結構鏈式棧的初始化鏈式棧的入棧操作鏈式棧的出棧操作 實現鏈式棧的所有代碼 棧 棧是…

學習網絡編程No.11【傳輸層協議之UDP】

引言&#xff1a; 北京時間&#xff1a;2023/11/20/9:17&#xff0c;昨天成功更文&#xff0c;上周實現了更文兩篇&#xff0c;所以這周再接再厲。當然做題任在繼續&#xff0c;而目前做題給我的感覺以套路和技巧偏多&#xff0c;還是那句話很多東西不經歷你就是不懂&#xff…

測試人員如何向開發人員準確清晰地描述問題?

測試人員向開發人員準確清晰地描述問題可以采取以下方法&#xff1a; 提供詳細的背景和上下文信息&#xff1a;描述問題發生的環境、前提條件和操作步驟&#xff0c;讓開發人員能夠了解問題出現的場景。明確問題的癥狀和表現&#xff1a;清楚地說明問題的具體表現&#xff0c;…

【Python】2. 基礎語法

常量和表達式 我們可以把 Python 當成一個計算器, 來進行一些算術運算. 注意: print 是一個 Python 內置的 函數, 這個稍后詳細介紹. 可以使用 - * / ( ) 等運算符進行算術運算. 先算乘除, 后算加減. 運算符和數字之間, 可以沒有空格, 也可以有多個空格. 但是一般習慣上寫一…

LDR6328芯片:智能家居時代的小家電充電革新者

在當今的智能家居時代&#xff0c;小家電的供電方式正變得越來越智能化和高效化。 利用PD&#xff08;Power Delivery&#xff09;芯片進行誘騙取電&#xff0c;為后端小家電提供穩定電壓的技術&#xff0c;正逐漸成為行業的新寵。在這一領域&#xff0c;LDR6328芯片以其出色的…

Qt下使用modbus-c庫實現PLC線圈/保持寄存器的讀寫

系列文章目錄 提示&#xff1a;這里是該系列文章的所有文章的目錄 第一章&#xff1a;Qt下使用ModbusTcp通信協議進行PLC線圈/保持寄存器的讀寫&#xff08;32位有符號數&#xff09; 第二章&#xff1a;Qt下使用modbus-c庫實現PLC線圈/保持寄存器的讀寫 文章目錄 系列文章目錄…

前端Vue3項目如何打包成Docker鏡像運行

將前端Vue3項目打包成Docker鏡像并運行包括幾個主要步驟&#xff1a;項目打包、編寫Dockerfile、構建鏡像和運行容器。下面是一個基本的流程&#xff1a; 1. 項目打包 首先&#xff0c;確保你的Vue3項目可以正常運行和打包。在項目根目錄下執行以下命令來打包你的Vue3項目&am…

nest.js使用nest-winston日志一

nest-winston文檔 nest-winston - npm 參考&#xff1a;nestjs中winston日志模塊使用 - 浮的blog - SegmentFault 思否 安裝 cnpm install --save nest-winston winstoncnpm install winston-daily-rotate-file 在main.ts中 import { NestFactory } from nestjs/core; im…

【5G 接口協議】GTP-U協議介紹

博主未授權任何人或組織機構轉載博主任何原創文章&#xff0c;感謝各位對原創的支持&#xff01; 博主鏈接 本人就職于國際知名終端廠商&#xff0c;負責modem芯片研發。 在5G早期負責終端數據業務層、核心網相關的開發工作&#xff0c;目前牽頭6G算力網絡技術標準研究。 博客…

mysql學習

查看glibc版本 ldd --version --mysql啟動失敗,嘗試啟動 1 查看錯誤日志,端口被占用,參數名寫錯,有不支持的參數 2 通過mysqld啟動 mysqld --default-filemy.cnf & 3 mysqld --no-defaults --basedir/user/local/mysql --datadir/data/mysql/3306/data/ --usermysql 4 str…

深入理解 Nginx 的負載均衡與反向代理

深入理解 Nginx 的負載均衡與反向代理 Nginx 是一個高性能的 HTTP 和反向代理服務器&#xff0c;也是一個 IMAP/POP3/SMTP 代理服務器。由于其出色的性能和靈活性&#xff0c;Nginx 已成為現代 web 架構中的重要組成部分&#xff0c;尤其是在處理高并發連接和大規模流量時。在…