pytorch基礎1-pytorch介紹與張量操作

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

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

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


這是本教程的第一篇,分為:

  1. 介紹pytorch基礎
  2. 張量操作

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

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


介紹

大多數機器學習工作流程都涉及處理數據、創建模型、使用超參數優化模型、保存和推斷已訓練的模型。本模塊介紹在 PyTorch 中實現的完整機器學習(ML)工作流程,PyTorch 是一種流行的 Python ML 框架。

本教程使用 FashionMNIST 數據集來訓練一個神經網絡模型,該模型可以識別圖像,如 T 恤/上衣、褲子、套衫、連衣裙、外套、涼鞋、襯衫、運動鞋、包包或短靴。

在構建模型之前,會展示構建神經網絡模型的關鍵概念。

學習目標:

  1. 學習如何在 CPU 和 GPU 上使用張量(Tensors)
  2. 理解如何管理、擴展和規范化數據集
  3. 使用神經網絡構建圖像識別模型
  4. 學習如何優化模型
  5. 學習如何提高模型推理性能

先修要求:

基本的 Python 知識


什么是張量 Tensor

張量

張量是一種專門的數據結構,非常類似于數組和矩陣。PyTorch使用張量來編碼模型的輸入和輸出,以及模型的參數。張量類似于NumPy數組和ndarrays,但是張量可以在GPU或其他硬件加速器上運行。事實上,張量和NumPy數組通常可以共享相同的底層內存地址,具有稱為bridge-to-np-label的功能,這消除了復制數據的需要。張量還針對自動微分進行了優化。

設置基本環境:

import torch
import numpy as np

初始化一個張量

張量可通過多種方式初始化,見如下例子:

1. 直接通過數據初始化

張量可以直接從數據中創建。數據類型是自動推斷的。

data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)

2. 從一個NumPy數組

張量可以從NumPy數組創建,反之亦然。由于numpy格式的np_array和張量格式x_np在這里共享相同的內存位置,改變其中一個的值將會改變另一個的值。

np_array = np.array(data)
x_np = torch.from_numpy(np_array)print(f"Numpy np_array value: \n {np_array} \n")
print(f"Tensor x_np value: \n {x_np} \n")np.multiply(np_array, 2, out=np_array)print(f"Numpy np_array after * 2 operation: \n {np_array} \n")
print(f"Tensor x_np value after modifying numpy array: \n {x_np} \n")

輸出是:

Numpy np_array value: [[1 2][3 4]] Tensor x_np value: tensor([[1, 2],[3, 4]], dtype=torch.int32) Numpy np_array after * 2 operation: [[2 4][6 8]] Tensor x_np value after modifying numpy array: tensor([[2, 4],[6, 8]], dtype=torch.int32) 

3. 從其他張量

x_ones = torch.ones_like(x_data) # retains the properties of x_data
print(f"Ones Tensor: \n {x_ones} \n")x_rand = torch.rand_like(x_data, dtype=torch.float) # overrides the datatype of x_data
print(f"Random Tensor: \n {x_rand} \n")

輸出是:

Ones Tensor: tensor([[1, 1],[1, 1]]) Random Tensor: tensor([[0.7907, 0.9041],[0.4805, 0.0954]]) 

4. 使用隨機數或常量

shape由張量維度的元組定義,它設置了張量的行數和列數。在下面的函數中,shape確定了輸出張量的維度。

shape = (2,3)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")

輸出:

Random Tensor: tensor([[0.5893, 0.4485, 0.6525],[0.9083, 0.2913, 0.0752]]) Ones Tensor: tensor([[1., 1., 1.],[1., 1., 1.]]) Zeros Tensor: tensor([[0., 0., 0.],[0., 0., 0.]])

張量的屬性 Attributes of a tensor

張量屬性描述了他們的形狀、數據類型和所處的設備。

tensor = torch.rand(3,4)print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")

輸出是:

Shape of tensor: torch.Size([3, 4])
Datatype of tensor: torch.float32
Device tensor is stored on: cpu

有100多個張量操作,包括算術運算、線性代數、矩陣操作(如轉置、索引和切片)。可以在這找到全面的描述。

這些操作中的每一個都可以在GPU上運行(通常比在CPU上速度更快)。

  • CPU的核心數少于100個。核心是執行實際計算的單元。每個核心按順序處理任務(一次處理一個任務)。

  • GPU有數千乃至上萬個核心。GPU核心以并行處理的方式處理計算,任務被分割并在不同核心上處理。這就是為什么在大多數情況下GPU比CPU更快的原因。GPU在處理大數據時表現比小數據更好,因為更有利于并行加速。GPU通常用于圖形或神經網絡的高強度計算。

  • PyTorch可以使用Nvidia CUDA庫來利用其GPU卡。

GPU并不總是優于CPU,因為CPU的單核性能強,因此在處理小數據時可能更占優勢。

默認情況下,張量在CPU上創建。張量也可以移動到GPU;為此,需要使用.to方法將它們移動(在檢查GPU可用性后)。當然,由于CPU和GPU之間的傳輸跨設備,這意味著傳輸上的巨大開銷。

# 如果GPU可用則將tensor移動到GPU上,GPU可用需要保證1. CUDA安裝;2. 安裝對應CUDA版本的pytorch,見https://pytorch.org/,選擇合適的pytorch安裝方式
if torch.cuda.is_available():tensor = tensor.to('cuda')

類似numpy的標準索引和切片 Standard numpy-like indexing and slicing

tensor = torch.ones(4, 4)
print('First row: ',tensor[0])
print('First column: ', tensor[:, 0])
print('Last column:', tensor[..., -1])
tensor[:,1] = 0
print(tensor)

輸出是:

First row:  tensor([1., 1., 1., 1.])
First column:  tensor([1., 1., 1., 1.])
Last column: tensor([1., 1., 1., 1.])
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])

拼接張量

可以使用 torch.cat 函數沿著指定維度連接一個張量序列。torch.stack是一個相關的張量拼接方法,它沿著新的維度將一個張量序列堆疊起來。以下例子,維度有四個可選值:

t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)

dim=1;輸出:

tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])

dim=0,輸出:

tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])

dim=-1,輸出:

tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])

dim=-2,輸出:

tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])

數學操作:

# 這計算了兩個張量之間的矩陣乘法。Y1 y2 y3的值是一樣的
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)y3 = torch.rand_like(tensor)
torch.matmul(tensor, tensor.T, out=y3)# 它計算元素級乘積,Z1 z2 z3的值是一樣的
z1 = tensor * tensor
z2 = tensor.mul(tensor)z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)print(y3)
print(z3)

輸出:

tensor([[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.],[3., 3., 3., 3.]])
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])

單元素張量

如果您有一個單元素張量,例如,通過將張量的所有值聚合為一個值,您可以使用item()將其轉換為Python數值:

agg = tensor.sum()
agg_item = agg.item()  
print(agg_item, type(agg_item))

輸出:

12.0 <class 'float'>

原地操作 in-place operations

將結果存儲到操作數(operand)中的操作稱為原地操作。它們通常用下劃線_作為后綴。例如:x.copy_(y),x.t_(),會改變x的值。

注意: 就地操作可以節省一些內存,但在計算導數時可能會出現問題,因為它們會立即丟失歷史記錄。因此,不建議使用它們。

print(tensor, "\n")
tensor.add_(5)
print(tensor)

輸出:

tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]]) tensor([[6., 5., 6., 6.],[6., 5., 6., 6.],[6., 5., 6., 6.],[6., 5., 6., 6.]])

與Numpy橋接 Bridge with Numpy

NumPy數組和CPU上的張量可以共享它們的底層內存位置,改變其中一個將改變另一個。

張量到NumPy數組的轉換

t = torch.ones(5)
print(f"t: {t}")
n = t.numpy()
print(f"n: {n}")
t.add_(1)
print(f"t: {t}")
print(f"n: {n}")

輸出:

t: tensor([1., 1., 1., 1., 1.])
n: [1. 1. 1. 1. 1.]
t: tensor([2., 2., 2., 2., 2.])
n: [2. 2. 2. 2. 2.]

NumPy數組到張量的轉換

n = np.ones(5)
t = torch.from_numpy(n)
np.add(n, 1, out=n)
print(f"t: {t}")
print(f"n: {n}")

輸出:

t: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
n: [2. 2. 2. 2. 2.]

代碼匯總

import torch
import numpy as npdata = [[1, 2], [3, 4]]
x_data = torch.tensor(data)np_array = np.array(data)
x_np = torch.from_numpy(np_array)print(f"Numpy np_array value: \n {np_array} \n")
print(f"Tensor x_np value: \n {x_np} \n")np.multiply(np_array, 2, out=np_array)print(f"Numpy np_array after * 2 operation: \n {np_array} \n")
print(f"Tensor x_np value after modifying numpy array: \n {x_np} \n")# 從其他張量
x_ones = torch.ones_like(x_data)  # retains the properties of x_data
print(f"Ones Tensor: \n {x_ones} \n")x_rand = torch.rand_like(x_data, dtype=torch.float)  # overrides the datatype of x_data
print(f"Random Tensor: \n {x_rand} \n")# random and constant
shape = (2, 3)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")# attributes
tensor = torch.rand(3, 4)print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")if torch.cuda.is_available():tensor = tensor.to('cuda')tensor = torch.ones(4, 4)
print('First row: ', tensor[0])
print('First column: ', tensor[:, 0])
print('Last column:', tensor[..., -1])
tensor[:, 1] = 0
print(tensor)t1 = torch.cat([tensor, tensor, tensor], dim=-1)
print(t1)# This computes the matrix multiplication between two tensors. y1, y2, y3 will have the same value
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)y3 = torch.rand_like(tensor)
torch.matmul(tensor, tensor.T, out=y3)# This computes the element-wise product. z1, z2, z3 will have the same value
z1 = tensor * tensor
z2 = tensor.mul(tensor)z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)print(y3)
print(z3)agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))print(tensor, "\n")
tensor.add_(5)
print(tensor)t = torch.ones(5)
print(f"t: {t}")
n = t.numpy()
print(f"n: {n}")
t.add_(1)
print(f"t: {t}")
print(f"n: {n}")n = np.ones(5)
t = torch.from_numpy(n)
np.add(n, 1, out=n)
print(f"t: {t}")
print(f"n: {n}")

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

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

相關文章

高中數學:分式函數值域的求法

一、求值域的兩種基本思路 1、根據函數圖像和定義域求出值域。 難點&#xff1a;畫出函數圖像 2、研究函數單調性和定義域求出值域。 二、函數圖像畫法 高中所學的分式函數&#xff0c;基本由反比例函數平移得到。 復雜分式函數圖像畫法的兩個要點&#xff1a; a、找垂直、…

mysql 常用命令練習

管理表格從表中查詢數據從多個表查詢修改數據sql變量類型 管理表格 創建一個包含三列的新表 CREATE TABLE products (id INT,name VARCHAR(255) NOT NULL,price INT DEFAULT 0,PRIMARY KEY(id) // 自增 ); 從數據庫中刪除表 DROP TABLE product; 向表中添加新列 ALTER TAB…

如何優化阿里云幻獸帕魯/Palworld的多人聯機性能,并避免內存溢出導致的異常退出游戲?

優化阿里云幻獸帕魯/Palworld的多人聯機性能并避免內存溢出導致的異常退出游戲&#xff0c;可以采取以下幾種方法&#xff1a; 選擇合適的內存配置&#xff1a;由于幻獸帕魯是一個對內存需求較高的游戲&#xff0c;建議選擇至少16GB的內存。對于不同的玩家數量&#xff0c;可以…

【ArcGIS】漁網分割提取柵格圖+網格化分析圖繪制

ArcGIS按漁網分割提取柵格圖并繪制網格化分析圖 準備數據操作步驟步驟1&#xff1a;創建漁網&#xff08;Create Fishnet&#xff09;步驟2&#xff1a;柵格數據處理步驟3&#xff1a;柵格插值步驟4&#xff1a;數據關聯 參考 網格化的目的是讓各個數據更加標準化的進行統計。因…

GO常量指針

Go語言中的常量使用關鍵字const定義&#xff0c;用于存儲不會改變的數據&#xff0c;常量是在編譯時被創建的&#xff0c;即使定義在函數內部也是如此&#xff0c;并且只能是布爾型、數字型&#xff08;整數型、浮點型和復數&#xff09;和字符串型。 由于編譯時的限制&#x…

自動化測試系列 —— UI自動化測試!

UI 測試是一種測試類型&#xff0c;也稱為用戶界面測試&#xff0c;通過該測試&#xff0c;我們檢查應用程序的界面是否工作正常或是否存在任何妨礙用戶行為且不符合書面規格的 BUG。了解用戶將如何在用戶和網站之間進行交互以執行 UI 測試至關重要&#xff0c;通過執行 UI 測試…

Maven 插件之 maven-enforcer-plugin 解決沖突重復依賴

目錄 0、前言1、enforcer 是什么2、能干什么3、怎么用4、規則5、擴展規則6、使用7、banDuplicateClasses8、banDuplicatePomDependencyVersions 0、前言 maven 項目種經常出現 jar 包沖突、重復依賴、無效引用怎么辦&#xff0c;maven-enforcer-plugin 了解一下 1、enforcer …

《AI紀元:幻域探險》

游戲項目名稱&#xff1a;《AI紀元&#xff1a;幻域探險》 游戲類型&#xff1a;AI驅動的角色扮演探險游戲&#xff08;RPG&#xff09; 背景設定&#xff1a; 《AI紀元&#xff1a;幻域探險》設定在一個名為“幻域”的廣闊虛擬世界。這個世界由高度發達的AI技術支持&#xff0…

SpringCloud-同步異步通訊比較

本文詳細探討了同步通訊和異步通訊在信息傳遞中的區別&#xff0c;以及它們分別帶來的優勢和不足。通過對支付流程的案例分析&#xff0c;突顯了同步通訊可能面臨的阻塞和服務依賴問題&#xff0c;而異步通訊通過引入事件驅動模式和消息代理&#xff08;Broker&#xff09;成功…

SQL Server 開發環境配置教程(SSMS+SQL Prompt)

背景 記錄一下 SQL Server 常用開發軟件 體驗了各種數據庫IDE(DBeaver、Navicat、DataGrip)之后綜合下來還是感覺 SSMSSQL Prompt 對于 SQL Server 最好用&#xff0c;所以在此記錄一下配置過程 數據庫可視化管理工具SSMS 官方下載地址&#xff1a; https://learn.microsoft…

Java基礎數據結構之棧

一.什么是棧 棧是一種特殊的線性表&#xff0c;它只允許在固定的一端進行元素的添加與使用&#xff0c;且遵循先進后出的原則。添加取用元素的一端稱為棧頂&#xff0c;另一端稱為棧底。出棧和入棧都是操作棧頂元素 二.棧的模擬實現 棧的底層是一個數組 這是里面的成員變量以…

智能汽車加速車規級存儲應用DS2431P+TR 汽車級EEPROM 存儲器IC

DS2431PT&R是一款1024位1-Wire EEPROM芯片&#xff0c;由四頁存儲區組成&#xff0c;每頁256位。數據先被寫入一個8字節暫存器中&#xff0c;經校驗后復制到EEPROM存儲器。該器件的特點是&#xff0c;四頁存儲區相互獨立&#xff0c;可以單獨進行寫保護或進入EPROM仿真模式…

第2章 線性代數

目錄 1. 標量、向量、矩陣和張量2. 矩陣和向量相乘3. 單位矩陣和逆矩陣4. 線性相關和生成子空間5. 范數6. 特殊類型的矩陣和向量7. 特征分解8. 奇異值分解9. Moore-Penrose偽逆10. 跡運算11. 行列式 1. 標量、向量、矩陣和張量 標量&#xff08;scalar&#xff09;&#xff1a;…

【 C++ 】特殊類設計

1、請設計一個類&#xff0c;不能被拷貝 拷貝只會出現在兩個場景中&#xff1a;拷貝構造函數以及賦值運算符重載&#xff0c;因此想要讓一個類禁止拷貝&#xff0c;只需讓該類不能調用拷貝構造函數以及賦值運算符重載即可。在C98和C11都有相對應的方法來解決此問題&#xff0c…

ssm172旅行社管理系統的設計與實現

** &#x1f345;點贊收藏關注 → 私信領取本源代碼、數據庫&#x1f345; 本人在Java畢業設計領域有多年的經驗&#xff0c;陸續會更新更多優質的Java實戰項目希望你能有所收獲&#xff0c;少走一些彎路。&#x1f345;關注我不迷路&#x1f345;** 一 、設計說明 1.1 研究…

day03-Vue-Element

一、Ajax 1 Ajax 介紹 1.1 Ajax 概述 概念&#xff1a;Asynchronous JavaScript And XML&#xff0c;異步 的 JavaScript 和 XML。 作用&#xff1a; 數據交換&#xff1a;通過 Ajax 可以給服務器發送請求&#xff0c;并獲取服務器響應的數據。異步交互&#xff1a;可以在 不…

Java教程:SpringBoot項目如何對接Nacos實現服務發現治理,配置管理

–Nacos大家都知道&#xff0c;不懂的可以去官網或者網上查閱一下&#xff0c;本次給大家講解一下如何在SpringBoot項目中引入Nacos服務來進行服務治理與發現&#xff0c;配置管理等&#xff0c;在微服務當中是必不可少的&#xff0c;各個模塊之間可以通過Feign遠程調用&#x…

物聯網主機:為智能交通賦能

物聯網&#xff08;IoT&#xff09;技術的發展為智能交通領域帶來了許多創新的解決方案。而在物聯網應用中&#xff0c;物聯網主機起著關鍵的作用。本文將為大家介紹一款名為E6000的物聯網主機&#xff0c;它是一種多協議、多接口的物聯網主機&#xff0c;為智能交通系統的建設…

antvX6 - Vue自定義節點,并實現多種畫布操作,拖拽、縮放、連線、雙擊、檢索等等

一、 首先 antv x6 分為兩個版本 低版本和高版本 我這里是使用的2.0版本 并且搭配了相關插件 例如&#xff1a;畫布的圖形變換、地圖等 個人推薦 2.0版本&#xff0c;高版本配置多&#xff0c;可使用相關插件多&#xff0c;但是文檔描述小&#xff0c;仍在更新&#xff0c; 低…

小d和圖片壓縮

題目描述 小ddd和她對象小紅去海洋館玩了&#xff0c;但是由于小ddd拍照技術不好&#xff0c;他對象說把她拍的像嘎子&#xff01; 小ddd看了看&#xff0c;發現是小紅最近長痘痘了&#xff0c;于是他為了討小紅開心&#xff0c;讓痘痘看不見&#xff0c;自學了圖像壓縮這個技…