PyTorch 張量(Tensor)詳解:從基礎到實戰

1. 引言

在深度學習和科學計算領域,張量(Tensor)?是最基礎的數據結構。PyTorch 作為當前最流行的深度學習框架之一,其核心計算單元就是張量。與 NumPy 的?ndarray?類似,PyTorch 張量支持高效的數值計算,但額外提供了?GPU 加速?和?自動微分(Autograd)?功能,使其成為構建和訓練神經網絡的理想選擇。

本文將全面介紹 PyTorch 張量的核心概念、基本操作、高級特性及實際應用,幫助讀者掌握張量的使用方法,并理解其在深度學習中的作用。

2. 什么是張量?

張量是多維數組的泛化,可以表示不同維度的數據:

  • 0D 張量(標量):單個數值,如?torch.tensor(5)

  • 1D 張量(向量):一維數組,如?torch.tensor([1, 2, 3])

  • 2D 張量(矩陣):二維數組,如?torch.tensor([[1, 2], [3, 4]])

  • 3D+ 張量(高階張量):如 RGB 圖像(3D)、視頻數據(4D)等

PyTorch 張量的主要特點:

  1. 支持 GPU 加速:可無縫切換 CPU/GPU 計算。

  2. 自動微分:用于神經網絡的反向傳播。

  3. 動態計算圖:更靈活的模型構建方式(與 TensorFlow 1.x 的靜態計算圖不同)。

3. 張量的創建與初始化

3.1 從 Python 列表或 NumPy 數組創建

import torch
import numpy as np# 從列表創建
t1 = torch.tensor([1, 2, 3])  # 1D 張量
t2 = torch.tensor([[1, 2], [3, 4]])  # 2D 張量# 從 NumPy 數組創建
arr = np.array([1, 2, 3])
t3 = torch.from_numpy(arr)  # 共享內存(修改一個會影響另一個)

3.2 特殊初始化方法

# 全零張量
zeros = torch.zeros(2, 3)  # 2x3 的零矩陣# 全一張量
ones = torch.ones(2)  # [1., 1.]# 隨機張量
rand_uniform = torch.rand(2, 2)  # 0~1 均勻分布
rand_normal = torch.randn(2, 2)  # 標準正態分布# 類似現有張量的形狀
x = torch.tensor([[1, 2], [3, 4]])
x_like = torch.rand_like(x)  # 形狀與 x 相同,值隨機

4. 張量的基本屬性

每個 PyTorch 張量都有以下關鍵屬性:

x = torch.rand(2, 3, dtype=torch.float32, device="cuda")print(x.shape)      # 形狀: torch.Size([2, 3])
print(x.dtype)      # 數據類型: torch.float32
print(x.device)     # 存儲設備: cpu / cuda
print(x.requires_grad)  # 是否啟用梯度計算(用于 Autograd)

4.1 數據類型(dtype)

PyTorch 支持多種數據類型:

  • torch.float32(默認)

  • torch.int64

  • torch.bool(布爾張量)

可以通過?.to()?方法轉換:

x = torch.tensor([1, 2], dtype=torch.float32)
y = x.to(torch.int64)  # 轉換為整型

4.2 設備(CPU/GPU)

PyTorch 允許張量在 CPU 或 GPU 上運行:

if torch.cuda.is_available():device = torch.device("cuda")x = x.to(device)  # 移動到 GPUy = y.to("cuda")  # 簡寫方式

5. 張量的基本運算

5.1 算術運算

a = torch.tensor([1, 2])
b = torch.tensor([3, 4])# 加法
c = a + b  # 等價于 torch.add(a, b)# 乘法(逐元素)
d = a * b  # [3, 8]# 矩陣乘法
mat_a = torch.rand(2, 3)
mat_b = torch.rand(3, 2)
mat_c = torch.matmul(mat_a, mat_b)  # 或 mat_a @ mat_b

5.2 形狀操作

x = torch.rand(4, 4)# 改變形狀(類似 NumPy 的 reshape)
y = x.view(16)  # 展平為一維張量
z = x.view(2, 8)  # 調整為 2x8# 轉置
x_t = x.permute(1, 0)  # 行列交換# 擴維 / 壓縮
x_expanded = x.unsqueeze(0)  # 增加一個維度(1x4x4)
x_squeezed = x_expanded.squeeze()  # 去除大小為1的維度

5.3 索引與切片

x = torch.rand(3, 4)# 取第一行
row = x[0, :]# 取前兩列
cols = x[:, :2]# 布爾索引
mask = x > 0.5
filtered = x[mask]  # 返回滿足條件的元素

6. 自動微分(Autograd)

PyTorch 的?autograd?模塊支持自動計算梯度,適用于反向傳播:

x = torch.tensor(2.0, requires_grad=True)
y = x ** 2 + 3 * x  # 計算圖構建
y.backward()  # 反向傳播
print(x.grad)  # dy/dx = 2x + 3 → 7.0

6.1 禁用梯度計算

with torch.no_grad():y = x * 2  # 不記錄梯度

7. 張量與 NumPy 的互操作

PyTorch 張量可以無縫轉換為 NumPy 數組:

# Tensor → NumPy
a = torch.rand(2, 2)
b = a.numpy()  # 共享內存(修改一個會影響另一個)# NumPy → Tensor
c = np.array([1, 2])
d = torch.from_numpy(c)  # 共享內存

8. 實際應用示例

8.1 線性回歸(手動實現)

# 數據準備
X = torch.rand(100, 1)
y = 3 * X + 2 + 0.1 * torch.randn(100, 1)# 初始化參數
w = torch.randn(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)# 訓練
lr = 0.01
for epoch in range(100):y_pred = w * X + bloss = ((y_pred - y) ** 2).mean()loss.backward()  # 計算梯度with torch.no_grad():w -= lr * w.gradb -= lr * b.gradw.grad.zero_()b.grad.zero_()print(f"w: {w.item()}, b: {b.item()}")

8.2 張量在 CNN 中的應用

import torch.nn as nn# 模擬輸入(batch_size=1, channels=3, height=32, width=32)
input_tensor = torch.rand(1, 3, 32, 32)# 定義一個簡單的 CNN
model = nn.Sequential(nn.Conv2d(3, 16, kernel_size=3),nn.ReLU(),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(16 * 15 * 15, 10)  # 假設輸出 10 類
)output = model(input_tensor)
print(output.shape)  # torch.Size([1, 10])

9. 總結

PyTorch 張量是深度學習的基礎數據結構,支持:

  • 多維數組計算(類似 NumPy)

  • GPU 加速(大幅提升計算速度)

  • 自動微分(簡化神經網絡訓練)

  • 動態計算圖(靈活調試模型)

掌握張量的基本操作是學習 PyTorch 的關鍵步驟。建議讀者通過官方文檔和實際項目加深理解,逐步掌握張量的高級用法(如廣播機制、高級索引等)。

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

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

相關文章

CPTS---Hospital

端口掃描 nmap -A -p- -n -Pn -T4 10.10.11.241 22/tcp open ssh OpenSSH 9.0p1 Ubuntu 1ubuntu8.5 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 256 e1:4b:4b:3a:6d:18:66:69:39:f7:aa:74:b3:16:0a:aa (ECDSA) |_ 256 96:c1:dc:d8:97:20:95:e7:01:5…

【貪心算法】day5

📝前言說明: 本專欄主要記錄本人的貪心算法學習以及LeetCode刷題記錄,按專題劃分每題主要記錄:(1)本人解法 本人屎山代碼;(2)優質解法 優質代碼;&#xff…

軟考中級【網絡工程師】第6版教材 第4章 無線通信網 (上)

考點分析: 重要程度:??? 選擇題考查1 ~ 3分,案例分析可能考查填空和簡答 高頻考點:802.11信道與頻段、CSMA/CA、無線網絡優化、無線認證、無線配置步驟 新教材變化:新增4G/5G、刪除無線城域網 本章將詳述蜂窩移動通信系統、無線局域網以及無線個人網的體系結構和實用技…

vscode+EIDE+Clangd環境導入keil C51以及MDK工程

我最近一直在使用vscodeclangd的編譯環境替代了vscode自帶的c/c插件。感覺clangd的環境更加優秀,能夠更好找到函數、全局變量等定義調用等。如果使用keil C51以及MDK環境開發51單片機或者STM32單片機就需要使用到了EIDE這個插件這個插件現在能夠自動生成compile_com…

FTP - 學習/實踐

1.應用場景 主要用于學習和使用FTP服務,同時研究其架構實現, 以及日常開發中的使用。 FTP(文件傳輸協議)是一種用于網絡文件傳輸的標準協議,基于客戶端-服務器模型運行,通過控制通道(端口21)和…

【瑞吉外賣】手機號驗證碼登錄(用QQ郵件發送代替)

目錄 介紹 一、獲取授權碼 二、前端代碼修改 三、后端代碼修改 ①pom依賴 ②yml配置 ③控制層 ④業務層 ⑤工具類 介紹 本文介紹了QQ郵箱驗證碼登錄功能的實現步驟: 獲取QQ郵箱授權碼并配置;前端修改登錄頁面,增加驗證碼發送接口調…

為什么要用 Markdown?以及如何使用它

在處理大量文檔時,尤其是在構建知識庫、進行文檔分析或訓練大語言模型(LLM)時,將各種格式的文件(如 PDF、Word、Excel、PPT、HTML 等)轉換為統一的 Markdown 格式,能夠顯著提高處理效率和兼容性…

訂餐后臺管理系統-day06菜品分類模塊

菜品分類顯示我們需要先實現分類操作,因為沒有菜品分類,我們無法準確知道當前菜品屬于哪個分類,在前端顯示時,需要根據分類顯示數據先顯示分類列表頁面準備路由manage_bp.route(/food/cat/list) def food_cat_list():# 默認頁面從…

More Effective C++ 條款20:協助完成返回值優化(Facilitate the Return Value Optimization)

More Effective C 條款20:協助完成返回值優化(Facilitate the Return Value Optimization)核心思想:返回值優化(RVO)是編譯器消除函數返回時臨時對象的一種重要優化技術。通過編寫適合RVO的代碼&#xff0c…

《HelloGitHub》第 113 期

興趣是最好的老師,HelloGitHub 讓你對開源感興趣!簡介HelloGitHub 分享 GitHub 上有趣、入門級的開源項目。github.com/521xueweihan/HelloGitHub這里有實戰項目、入門教程、黑科技、開源書籍、大廠開源項目等,涵蓋多種編程語言 Python、Java…

萌寶喂養日志-我用AI做喂養記錄小程序1-原型設計

準備工作 首先,注冊硅基流動賬號,并配置Trae開發工具。 ↓現在注冊有2000 萬 Tokens 的免費額度↓。 硅基流動統一登錄 具體可以看我這篇文章:Trae接入自有Deepseek模型,不再排隊等待-CSDN博客 實踐 設計原型圖 我想開發一…

工業產品營銷:概念、原理、流程與實踐指南

摘要 工業產品營銷是針對B2B市場的專業化推廣活動,旨在滿足企業客戶的生產和運營需求。本文詳細闡述了工業產品營銷的概念與特點,分析其核心原理,包括客戶需求驅動、價值傳遞和關系管理。營銷過程涵蓋市場調研、細分定位、策略制定、執行、轉化及售后服務六個步驟,并提供品…

【讀書筆記】《人體微生物的奧秘》

Follow Your Gut:人體微生物的奧秘 引言:從蚊子到微生物 夏天來臨,許多人又開始糾結為什么有些人特別招蚊子。有人說是血型問題,有人說是皮膚嫩度,還有人歸結于基因。但今天要分享的一本書,雖然標題看似討論…

【Matplotlib學習】駕馭畫布:Matplotlib 布局方式從入門到精通完全指南

目錄駕馭畫布:Matplotlib 布局方式從入門到精通完全指南一、 核心理念:理解 Figure 和 Axes二、 布局方式大全:從簡單到復雜類別一:自動創建與基礎單圖布局類別二:規律網格布局 - 主力軍類別三:復雜網格布局…

【C#】在一個任意旋轉的矩形(由四個頂點定義)內繪制一個內切橢圓

核心點:在一個任意旋轉的矩形(由四個頂點定義)內繪制一個內切橢圓 實現步驟 計算矩形中心:作為旋轉中心點 創建橢圓路徑:在未旋轉狀態下定義橢圓 應用旋轉變換:使用矩陣繞中心點旋轉路徑 繪制變換后的路…

洛谷 P2052 [NOI2011] 道路修建-普及/提高-

P2052 [NOI2011] 道路修建 題目描述 在 W 星球上有 nnn 個國家。為了各自國家的經濟發展,他們決定在各個國家之間建設雙向道路使得國家之間連通。但是每個國家的國王都很吝嗇,他們只愿意修建恰好 n?1n - 1n?1 條雙向道路。 每條道路的修建都要付出一定…

springboot連接不上redis,但是redis客戶端是能連接上的

除了常規排查,還有一個就是檢查配置文件格式。這個舊版本格式會導致讀取不到配置,spring:# 對應 RedisProperties 類redis:host: 127.0.0.1port: 6379 # password: 123456 # Redis 服務器密碼,默認為空。生產中,一定要設置 Red…

GitBook 完整使用指南:從安裝到部署

文章目錄 環境準備 Node.js 安裝 GitBook CLI 安裝 項目初始化 創建項目結構 (可選) npm 初始化 目錄結構配置 開發與調試 本地服務啟動 構建靜態文件 配置文件詳解 插件系統 常用插件推薦 插件安裝與配置 自定義樣式 部署指南 GitHub Pages 部署 Netlify 部署 高級功能 多語言…

VS安裝 .NETFramework,Version=v4.6.x

一、前言 在使用VS2019打開項目時提示MSB3644 找不到 .NETFramework,Versionv4.6.2 的引用程序集的錯誤 二、解決方案 1.百度......找到了解決方法了 2.打開Visual Studio Install 3.點擊修改 4.點擊單個組件,安裝相對應的版本即可

Visual Studio Code中launch.json的解析筆記

<摘要> launch.json 是 Visual Studio Code 中用于配置調試任務的核心文件。本文解析了其最常用的配置字段&#xff0c;涵蓋了基本調試設置、程序控制、環境配置和高級調試功能。理解這些字段能幫助開發者高效配置調試環境&#xff0c;提升開發效率。<解析> 1. 背景…