【PyTorch學習筆記 - 01】 Tensors(張量)

最近項目需要優化一下目標檢測網絡,在這個過程中發現還是得增加對框架底層的掌握才可行。于是準備對pytorch的一些基本概念做一些再理解。參考PyTorch的wiki,對自己的學習過程做個記錄。

Tensors 是一種特殊的數據結構,與數組和矩陣非常相似。在PyTorch中,我們使用張量對模型的輸入、輸出以及模型參數進行編碼。

張量類似于 NumPy 的 ndarray不同之處在于張量可以在 GPU 或其他硬件加速器上運行。事實上,張量和 NumPy 數組通常可以共享相同的底層內存,從而無需復制數據。張量還針對自動求導進行了優化。如果你熟悉 ndarray,那么使用張量 API 會得心應手。如果不熟悉,也別擔心,跟著學就行!

import torch
import numpy as np

一、怎么初始化 Tensors

張量可以通過多種方式初始化。

1.直接從數據中獲取
張量可以直接從數據創建。數據類型會自動推斷。

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

2.從NumPy數組
張量可以從NumPy數組創建:

np_array = np.array(data)
x_np = torch.from_numpy(np_array)

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")

4.使用隨機值或常數值:
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}")

二、張量的屬性

張量屬性描述了它們的形狀、數據類型以及存儲它們的設備。

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}")

在這里插入圖片描述

三、張量運算

這里全面介紹了1200多種張量運算,包括算術運算、線性代數、矩陣操作(轉置、索引、切片)、采樣等等。

這些操作中的每一項都可以在CPU和加速器(如CUDA、MPS、MTIA或XPU)上運行。

默認情況下,張量是在CPU上創建的。我們需要使用.to方法(在檢查加速器可用性之后)顯式地將張量移動到加速器上。wiki提醒,跨設備復制大張量在時間和內存方面的開銷可能很大

# We move our tensor to the current accelerator if available
if torch.accelerator.is_available():tensor = tensor.to(torch.accelerator.current_accelerator())

在這里插入圖片描述

嘗試列表中的一些操作。如果你熟悉NumPy API,那么使用Tensor API對你來說將輕而易舉。

標準的類似numpy的索引和切片操作:

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

拼接張量 你可以使用 torch.cat 沿著給定維度拼接一系列張量。另請參閱 torch.stack,這是另一個與 torch.cat 略有不同的張量拼接操作符

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
# ``tensor.T`` returns the transpose of a tensor
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)y3 = torch.rand_like(y1)
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)

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

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

原地操作將結果存儲到操作數中的操作稱為原地操作。它們以 _ 后綴表示。例如:x.copy_(y)x.t_() 會改變 x

print(f"{tensor} \n")
tensor.add_(5)
print(tensor)

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

四、與NumPy的橋接

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

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

張量的變化會反映在NumPy數組中。

t.add_(1)
print(f"t: {t}")
print(f"n: {n}")

NumPy數組轉換為張量

n = np.ones(5)
t = torch.from_numpy(n)

NumPy數組中的變化會反映在張量中。

張量轉換為NumPy數組

這是YOLO12推理時,將后端可視化的操作。將Tensor格式的檢測結果,從gpu取到cpu上,轉為numpy數組。
在這里插入圖片描述
再使用opencv的函數進行檢測結果可視化(檢測框繪制和標簽繪制)。
在這里插入圖片描述
最終的結果如下圖:
在這里插入圖片描述

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

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

相關文章

【C/C++】(struct test*)0->b 講解

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 一、什么是結構體成員的偏移量? 二、為什么需要計算偏移量? 三、如何計算偏移量? 四、總結 一、什么是結構體成員的偏移量&#…

使用Pytest進行接口自動化測試(三)

(一)YAML 之前在項目中,我們也是用過YAML來做配置文件,他用于以人類可讀的形式存儲信息, 特點: 一種簡易的可讀語言,用于人和計算機交換數據 通常用來存儲配置信息 跟python類似&…

算法訓練營day46 647. 回文子串、516.最長回文子序列、動態規劃總結篇

今天是動態規劃的最后一篇內容了,本篇主要是針對回文字符串這種“與眾不同”的遞推規律來進行講解 647. 回文子串 統計并返回這個字符串中 回文子串 的數目 暴力解法 兩層for循環,遍歷區間起始位置和終止位置,然后還需要一層遍歷判斷這個區…

Qt界面優化

1.QSS在網頁前端開發領域中,CSS 是一個至關重要的部分,描述了一個網頁的 “樣式”,從而起到對網頁美化的作用。所謂樣式,包括不限于大小、位置、顏色、背景、間距、字體等等。網頁開發作為 GUI 的典型代表,也對于其他客…

week1+2+3

408 計組 1.基本組成2.數據的表示和運算定點數:把數字分為定點整數和定點小數分開存儲 浮點數:用科學計數法存儲 原碼 -全部取反-> 反碼 反碼 1->補碼 補碼 -符號位取反->移碼帶余除法:設x,m∈Z,m>0則存在唯一的整數q…

java8中javafx包缺少報錯

今天拉取一個jdk1.8的項目里面有一個代碼用到了javafx,這個我記得是jdk中的包,正常不應該報錯的。然后發現jdk中還真沒有,查了一下是因為版本問題。 Java 8 及之前:Oracle JDK 自帶 JavaFX,OpenJDK 通常不包含Java 9 …

day072-代碼檢查工具-Sonar與maven私服-Nexus

文章目錄0. 老男孩思想-選對池塘釣美人魚1. 代碼回滾方案2. SonarQube2.1 代碼檢查工具2.2 部署sonarqube2.2.1 軟件要求2.2.2 安裝軟件2.2.3 啟動sonar2.2.4 部署插件2.3 sonar檢查java代碼2.3.1 創建sona項目2.3.2 分析java代碼2.3.3 Jenkins結合sonar檢查代碼2.4 sonar檢查非…

【前端基礎】15、列表元素、表格元素、表單元素(注:極其粗略的記載。)

一、列表元素 1、什么是列表元素2、有序列表(ol、li) ol有序列表 直接子元素只能是li。 li列表中的每一項。3、無序列表(ul、li) ol無序列表 直接子元素只能是li。 li列表中的每一項。4、定義列表(dl、dt、dd&#xff…

IRFBG30PBF Vishay威世MOSFET場效應管

IRFBG30PBF Vishay威世:超快MOSFET 場效應管一、產品定位IRFBG30PBF 是Vishay威世推出的600V/30A N溝道功率MOSFET,采用第五代TrenchFET技術,專為開關電源、電機驅動、新能源逆變器等高功率場景設計。以85mΩ超低導通電阻和超快反向恢復&…

【07-AGI的討論】

AI ANI:artificial narrow intelligence; 如 智能音箱;自動駕駛汽車,網絡搜索,其他用于專業特定事項的工具; AGI:artificial general intelligence; building AI systems that could do anything a typical…

[激光原理與應用-225]:機械 - 3D圖與2D圖各自的作用

在機械設計與加工領域,3D圖和2D圖是兩種核心的工程表達方式,它們在產品設計、制造、裝配及維護等環節中扮演不同角色,具有互補性。以下是它們各自的作用及具體應用場景的詳細解析:一、3D圖的作用1. 直觀展示產品全貌三維可視化&am…

【從零開始java學習|第一篇】java中的名詞概念(JDK、JVM、JRE等等)

目錄 一、核心運行環境三要素(JVM/JRE/JDK) 二、常用開發指令(JDK 自帶工具) 三、一些其他概念 四、總結核心邏輯鏈 要入門 Java,理解核心概念之間的關系是基礎。以下是 Java 中最核心的基礎概念、工具及相關名詞的…

UVa12345 Dynamic len(set(a[L:R]))

[TOC](UVa12345 Dynamic len(set(a[L:R]))) 題目鏈接 UVA - 12345 Dynamic len(set(a[L:R])) 題意 有編號從 0 到 n?1 的 n 個數,有兩種操作: Q L R 詢問編號 L 到編號 R?1 的數中有多少個不同的數字。M X Y 將編號為 X 的數字改為 Y。 你的任務就是…

[Ubuntu] VNC連接Linux云服務器 | 實現GNOME圖形化

將桌面環境修改為 GNOME 并通過 VNC 遠程訪問的步驟 & TightVNC 的安裝與配置說明:1. 安裝 GNOME 桌面環境 sudo apt update sudo apt install ubuntu-gnome-desktop -y2. 安裝 TightVNC 服務器 sudo apt install tightvncserver -y3. 初始化 VNC Server 并設置…

進程、網絡通信方法

一、進程間通信(IPC)方法 適用于同一臺主機上的進程間數據交換。 管道(Pipe) 匿名管道:單向通信,僅用于父子進程。 命名管道(FIFO):通過文件系統路徑訪問,支持無親緣關系進程。 消息隊列(Message Queue) 結構化消息(類型+數據),按類型讀取,支持異步通信。…

[激光原理與應用-241]:設計 - 266n皮秒深紫外激光器,哪些因素影響激光器紫外光的輸出功率?

一、短期穩定性266nm皮秒深紫外激光器紫外光輸出功率的穩定性受非線性晶體性能、光學系統設計、熱管理效果、重復頻率與脈沖能量匹配度、環境干擾控制等因素影響,具體分析如下:1. 非線性晶體性能晶體選擇與狀態:BBO(偏硼酸鋇&…

Django配置sqllite之外的數據庫

當連接到其他數據庫后端時,如 MariaDB、MySQL、Oracle 或 PostgreSQL,將需要額外的連接參數。請參閱下面的 ENGINE 配置,了解如何指定其他數據庫類型。這個例子是針對 PostgreSQL: 在django項目的settings.py文件里,關…

銀河通用招人形機器人強化學習算法工程師了

人形強化學習算法工程師(26屆)(崗位信息已通過jobleap.cn授權,可在csdn發布)銀河通用機器人 北京收錄時間: 2025年08月11日職位描述1. 研發基于深度強化學習的足式機器人運動控制算法,提升機器…

使用MongoDB存儲和計算距離

一、MongoDB 計算距離的優勢 優勢說明原生地理空間索引支持 2dsphere 索引,高效處理地理坐標查詢(毫秒級響應)。內置地理計算函數提供 $near、$geoWithin、$geoNear 等操作符,無需手動實現復雜計算。高性能基于B樹索引優化&#…

鴻蒙開發-ArkUI中@Type作用詳細解答

在鴻蒙(HarmonyOS)應用開發中,Type 是 ArkUI 框架中用于 類型定義和類型檢查 的關鍵注解(裝飾器)。它的主要作用是為自定義組件的屬性提供明確的類型約束,確保數據傳遞的類型安全性。 核心作用解析&#xf…