PyTorch里的張量及張量的操作

張量的簡介

張量是多重線性映射在給定基下的坐標表示,可視為向量和矩陣的泛化。

  • 0 維張量:標量(如?5
  • 1 維張量:向量(如?[1, 2, 3]
  • 2 維張量:矩陣(如?[[1, 2], [3, 4]]
  • 3 維及以上張量:多維數組(如圖像、視頻、時間序列數據)

創建張量的方法

直接從數據創建

x = torch.tensor([5.5, 3])  # 從列表創建
print(x)  # tensor([5.5000, 3.0000])

創建了一個包含兩個浮點數的一維張量,創建一個形狀為?[2]?的張量,包含元素?[5.5, 3.0],數據類型默認為?torch.float32

默認情況下,張量會創建在 CPU 上。若要在 GPU 上運行,需顯式指定(如?.to('cuda'))

全0或全1張量

zeros = torch.zeros(4, 3, dtype=torch.long)  # 4x3全0矩陣,數據類型為long
ones = torch.ones(2, 2)  # 2x2全1矩陣
print(zeros)

?

zeros 張量:使用 torch.zeros() 創建一個形狀為 [4, 3] 的全零矩陣,數據類型指定為 torch.long(即 64 位整數)。
ones 張量:使用 torch.ones() 創建一個形狀為 [2, 2] 的全一矩陣,數據類型默認為 torch.float32。

隨機初始化張量

rand = torch.rand(4, 3)  # 4x3隨機矩陣(均勻分布[0,1))
randn = torch.randn(4, 3)  # 4x3隨機矩陣(標準正態分布)
print(rand)
print(randn)

rand 張量:使用 torch.rand(4, 3) 創建一個形狀為 [4, 3] 的隨機矩陣,元素服從 均勻分布 U(0, 1)(范圍從 0 到 1,包含 0 但不包含 1)。
randn 張量:使用 torch.randn(4, 3) 創建一個形狀為 [4, 3] 的隨機矩陣,元素服從 標準正態分布 N(0, 1)(均值為 0,標準差為 1)。

基于現有張量創建

x = torch.new_ones(4, 3, dtype=torch.double)  # 全1矩陣,double類型
y = torch.randn_like(x, dtype=torch.float)  # 與x形狀相同的隨機矩陣,float類型
print(x.size())  # torch.Size([4, 3])
print(y.shape)   # 等價于.size()

torch.new_ones():創建一個與調用對象(此處為torch)相同類型的全 1 張量。dtype=torch.double指定數據類型為 64 位浮點數(等價于torch.float64)。
torch.randn_like():基于已有張量的形狀創建新張量。dtype=torch.float覆蓋原始數據類型,生成 32 位浮點數(等價于torch.float32)的隨機張量(正態分布)。

報錯:

raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
AttributeError: module 'torch' has no attribute 'new_ones'

錯誤的原因是 torch.new_ones() 并不是 PyTorch 的全局函數,而是 張量對象的方法(即需要通過已有的張量實例調用)。

# 正確寫法:通過現有張量調用 new_ones()
# 1. 先創建一個基礎張量(用于指定設備和數據類型)
base_tensor = torch.tensor([], dtype=torch.double)  # 空張量,僅指定類型
# 2. 基于基礎張量創建全1張量
x = base_tensor.new_ones(4, 3)  # 形狀為 (4, 3),數據類型與 base_tensor 一致(double)
print(x)
print(x.dtype)  # 輸出:torch.float64(即 double 類型)# 更簡潔的等價寫法:直接用 torch.ones() 指定形狀和類型
x = torch.ones(4, 3, dtype=torch.double)  # 效果與上面完全相同
print(x)

常用函數

torch.Tensor()?? ?基礎構造函數
torch.zeros()?? ?全 0 張量
torch.ones()?? ?全 1 張量
torch.rand()?? ?均勻分布隨機張量
torch.randn()?? ?正態分布隨機張量
torch.arange()?? ?等差數列張量
torch.linspace()?? ?等分數列張量

運算

三種加法

方式一

x = torch.rand(4, 3)
y = torch.rand(4, 3)
print(x + y)

方式二

torch.add(x, y)

方式三

y.add_(x) 
print(y)

減乘除

print(x-y)
print(x*y)
print(x/y)

索引

x[k, :]

取第k+1行,因為索引從0開始

x[:,k]

取第k+1列

import torch
x = torch.rand(4, 3)
print(x)
print(x[1,:])
print(x[:,1])

另外可以用

x[p,q] = 100

來修改特定位置的元素

索引操作返回的是原張量的視圖(view),共享內存。如需獨立副本,使用 .clone()。

維度變換

y = x.view(16)  # 將x展平為1維向量
z = x.view(-1, 8)  # -1表示該維度由其他維度推斷(16/8=2)

view()返回的是原張量的視圖(共享內存),不復制數據。-1是動態推斷維度的占位符,總元素數必須匹配(4×4=16)

print(x.size(), y.size(), z.size())  # 輸出: [4, 4] [16] [2, 8]

所有張量共享相同的 16 個元素,只是組織方式不同

# 功能類似view,但可能返回副本
a = x.reshape(2, 8)

reshape()是更靈活的操作:若原張量內存連續,返回視圖(等價于view());若不連續(如經過轉置),會強制復制數據

# 使用clone()創建獨立副本后再view
b = x.clone().view(16)

?x.clone() 創建了一個與 x 具有相同數據但內存獨立的新張量。這意味著修改 b 不會影響原始張量 x。
.view(16) 將克隆后的張量調整為一維向量(長度為 16)。由于 clone() 返回的是連續內存的張量,view() 可以直接操作而無需額外復制。

import torch
x=torch.rand(4,3)
print(x)
y=x.view(12)
z=x.view(-1,2)
print(x.size(),y.size(),z.size())

輸出:

import torch
x=torch.rand(4,3)
print(x)
a=x.reshape(2,6)
print(a)
b=x.clone().view(12)
print(b)

輸出:?

取值操作

x = torch.randn(1)
print(x)  # tensor([-0.3456])
print(x.item())  # -0.3456234779701233(轉為Python標量)

廣播機制

當對兩個張量執行運算時,PyTorch 會按以下規則自動處理形狀差異:

維度對齊:將維度較少的張量左側補 1,使兩者維度數相同。
例:a.shape = (2, 3, 4),b.shape = (3, 1) → 補全后 b.shape = (1, 3, 1)。
維度兼容性檢查:對每個維度,若大小不同,則其中必須有一個為 1,否則廣播失敗。
兼容示例:(3, 1) 和 (1, 4) → 可廣播為 (3, 4)。
不兼容示例:(2, 3) 和 (2, 4) → 最后一維 3≠4 且均不為 1,廣播失敗。
維度擴展:將維度為 1 的軸擴展到與另一張量對應維度相同的大小(實際計算中不復制數據,僅邏輯擴展)。
例:a.shape = (3, 4) 與補全后的 b.shape = (1, 4) → 廣播后均為 (3, 4)。

當兩個形狀不同的張量進行運算時,PyTorch 會自動觸發廣播機制

import torcha = torch.tensor([1, 2, 3])  # shape: (3,)
b = torch.tensor(5)          # shape: ()result = a + b
print(result)  # tensor([6, 7, 8])
a = torch.randn(2, 3)        # shape: (2, 3)
b = torch.randn(3)           # shape: (3,)result = a + b
print(result.shape)  # torch.Size([2, 3])
a = torch.randn(2, 1, 3)     # shape: (2, 1, 3)
b = torch.randn(1, 3)        # shape: (1, 3)result = a + b
print(result.shape)  # torch.Size([2, 1, 3])
a = torch.randn(2, 3)        # shape: (2, 3)
b = torch.randn(2, 4)        # shape: (2, 4)# 會報錯
try:result = a + b
except RuntimeError as e:print(e)
# 輸出: The size of tensor a (3) must match the size of tensor b (4) at non-singleton dimension 1
a = torch.randn(1, 2, 1)     # shape: (1, 2, 1)
b = torch.randn(3, 1, 4)     # shape: (3, 1, 4)result = a + b
print(result.shape)  # torch.Size([3, 2, 4])

所有維度都會嘗試廣播:
第 0 維:1 vs 3 → 擴展為 3
第 1 維:2 vs 1 → 擴展為 2
第 2 維:1 vs 4 → 擴展為 4
結果形狀為 (3, 2, 4)

a = torch.arange(1, 3).view(1, 2)  # tensor([[1, 2]])
b = torch.arange(1, 4).view(3, 1)  # tensor([[1], [2], [3]])
print(a + b)

torch.arange()創建一個一維張量,包含從 start 到 end - 1(左閉右開)的等差數列。

torch.arange(start=0, end, step=1, dtype=None, device=None, requires_grad=False)

start:起始值(默認為 0)
end:結束值(不包含)
step:步長(默認為 1)
dtype:數據類型(如 torch.int, torch.float 等)

b = torch.arange(1, 4)  # start=1, end=4 → [1, 2, 3]
# tensor([1, 2, 3])
a = torch.arange(1, 3).view(1, 2)   # shape: (1, 2)
b = torch.arange(1, 4).view(3, 1)   # shape: (3, 1)print(a + b)
a = [[1, 2]]        # shape (1, 2)
b = [[1],[2],[3]]           # shape (3, 1)# 廣播后:
a = [[1, 2],[1, 2],[1, 2]]        # shape (3, 2)b = [[1, 1],[2, 2],[3, 3]]        # shape (3, 2)# 相加:
result = [[2, 3],[3, 4],[4, 5]]

廣播機制 不會復制數據,而是通過“虛擬擴展”(broadcast)的方式,讓不同形狀的張量看起來像是相同形狀,從而進行逐元素操作。這在內存和性能上都非常高效。

?張量與 NumPy 的交互

import numpy as np# NumPy數組轉PyTorch張量
a = np.array([1, 2, 3])
b = torch.from_numpy(a)  # 共享內存
print(b)  # tensor([1, 2, 3], dtype=torch.int32)# PyTorch張量轉NumPy數組
c = torch.rand(3)
d = c.numpy()  # 共享內存
print(d)  # [0.1234 0.5678 0.9012]# 修改其中一個會影響另一個(因為共享內存)
a[0] = 100
print(b)  # tensor([100,   2,   3], dtype=torch.int32)
a = np.array([1, 2, 3])
b = torch.from_numpy(a) 

?torch.from_numpy() 的作用:這是 將 NumPy 數組轉換為 PyTorch 張量 的函數。
關鍵點:共享內存!也就是說,b 和 a 指向的是同一塊內存區域。
如果修改 a,b 也會變;反之亦然。

print(b)  # tensor([1, 2, 3], dtype=torch.int32)

輸出張量 b,其數據類型是 torch.int32,對應于 NumPy 的 np.int32 或 np.int64(根據系統)。
PyTorch 會根據 NumPy 數組的 dtype 自動推斷張量的 dtype。

d = c.numpy()

.numpy() 的作用:.numpy() 是 PyTorch 張量的方法,用于將其轉換為 NumPy 數組。
同樣,共享內存!即 c 和 d 指向的是同一塊內存空間。

自動求梯度(Autograd)

x = torch.tensor([2.0], requires_grad=True) 

torch.tensor([2.0]):創建一個包含單個元素的張量 x = 2.0。
requires_grad=True:告訴 PyTorch 需要為這個張量記錄梯度。只有設置了這個參數的張量,才會在反向傳播時計算梯度。默認情況下,requires_grad=False,即不記錄梯度。

# 定義函數 y = x^2
y = x**2

這里我們定義了一個函數 y = x^2。y 是一個張量,它是由 x 經過計算得到的。PyTorch 會自動記錄這個計算過程,構建一個 計算圖(computation graph),以便后續進行反向傳播。

# 反向傳播計算梯度
y.backward()  # 等價于 y.backward(torch.tensor(1.0))

y.backward():觸發反向傳播,計算 y 對所有需要梯度的輸入張量(比如 x)的梯度。
因為 y 是一個標量(只有一個元素),所以不需要傳入參數。
如果 y 是一個向量或更高維的張量,則需要傳入一個與 y 同形狀的 梯度向量,作為鏈式法則中的“上游梯度”。

y.backward() 等價于 y.backward(torch.tensor(1.0)),因為 PyTorch 默認對標量調用 .backward() 時使用 1.0 作為梯度。

# 查看梯度 dy/dx = 2x = 2*2 = 4
print(x.grad)  # tensor([4.])

x.grad:這是 x 的梯度,也就是 dy/dx。因為 y = x^2,所以 dy/dx = 2x。當 x = 2 時,dy/dx = 4。所以輸出為:tensor([4.])。

# 1. 定義模型參數
w = torch.randn(1, requires_grad=True)
b = torch.randn(1, requires_grad=True)# 2. 輸入數據
x = torch.tensor([2.0])# 3. 前向傳播
y_pred = w * x + b# 4. 定義目標值和損失函數
y_true = torch.tensor([5.0])
loss = (y_pred - y_true)**2# 5. 反向傳播
loss.backward()# 6. 查看梯度
print("w.grad:", w.grad)
print("b.grad:", b.grad)

參考文章

thorough-pytorch/source/第二章/2.1 張量.md at main · datawhalechina/thorough-pytorchhttps://github.com/datawhalechina/thorough-pytorch/blob/main/source/%E7%AC%AC%E4%BA%8C%E7%AB%A0/2.1%20%E5%BC%A0%E9%87%8F.md

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

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

相關文章

向量數據庫Faiss vs Qdrant全面對比

Faiss vs Qdrant 全面對比表 向量數據庫是一種相對較新的方式,用于與來自不透明機器學習模型(如深度學習架構)派生的抽象數據表示進行交互。這些表示通常被稱為向量或嵌入(embeddings),它們是用于訓練機器學習模型完成諸如情感分析、語音識別、目標檢測等任務的數據的壓…

2025年AIR SCI1區TOP,縮減因子分數階蜣螂優化算法FORDBO,深度解析+性能實測

目錄1.摘要2.蜣螂優化算法DBO原理3.改進策略4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流1.摘要 傳統DBO存在探索與開發能力失衡、求解精度低以及易陷入局部最優等問題。因此,本文提出了帶有縮減因子分數階蜣螂優化算法(FORDBO&#xff0…

爬蟲逆向之JS混淆案例(全國招標公告公示搜索引擎 type__1017逆向)

案例https://ctbpsp.com/#/ 截至2025.07.19可用 定位加密位置 加密位置: 定位方式,XHR,跟棧 跟棧 QL打斷點,重新斷住 分析為,一個函數傳入四個參數 var QL QI[d9(Nv.mQ)](QJ, Qh, Qv, this[d9(Nv.m9)][0xa1a * …

Hive常用命令總結

一、數據庫操作 -- 創建數據庫(默認路徑) CREATE DATABASE IF NOT EXISTS myhive;-- 指定路徑創建數據庫 CREATE DATABASE myhive2 LOCATION /myhive2;-- 查看數據庫信息 DESC DATABASE myhive;-- 刪除數據庫(強制刪除表) DROP DA…

Spring整合MyBatis詳解

Spring整合MyBatis詳解一、整合優勢與核心思路1.1 整合優勢1.2 核心整合思路二、環境搭建與依賴配置2.1 開發環境2.2 Maven依賴配置三、整合配置(核心步驟)3.1 數據庫配置文件(db.properties)3.2 Spring配置文件(sprin…

Windows CMD(命令提示符)中最常用的命令匯總和實戰示例

CMD命令匯總 下面是 Windows CMD(命令提示符)中最常用的命令匯總,共 30 個,包含說明和典型代碼示例,適合日常開發、系統操作、文件管理、網絡診斷等場景。一、文件與目錄操作(最常用)命令說明示…

嵌入式硬件篇---舵機(示波器)

舵機是一種高精度的角度控制執行器件,廣泛應用于機器人、航模、自動化設備等領域。其核心特點是能通過控制信號精準定位到特定角度(通常范圍為 0-180,部分可到 360 連續旋轉)。常見的舵機類型可根據結構、控制方式、用途等維度劃分…

嵌入式硬件篇---按鍵

按鍵是電子系統中最基礎的人機交互部件,通過機械或電子方式實現電路通斷或狀態切換。根據結構和工作原理的不同,常見按鍵可分為機械按鍵、薄膜按鍵、觸摸按鍵等,以下詳細介紹其工作原理、應用場景及電路特點:一、機械按鍵&#xf…

試用SAP BTP 06:AI服務-Data Attribute Recommendation

創建實例 方法一:BTP主控室-子賬戶-服務市場 輸入實例配置信息,下一步 不用參數,下一步 審核實例,點擊創建 實例創建完成后,創建服務鍵值 輸入鍵值名稱,點擊 創建 方法二(建議)&…

訓詁學中的“形音義互求”對NLP、知識圖譜、注意力機制的啟示

一、訓詁學與現代人工智能結合的學術價值與技術潛力1. ??訓詁學的核心優勢與AI語義分析的契合點??訓詁學作為中國傳統學術中研究古代文獻語義的核心學科,其方法論和理論框架對自然語言處理(NLP)的深層語義分析具有深刻的啟發性和技術補充…

http基礎一

1. HTTP是什么? HTTP(超文本傳輸協議,HyperText Transfer Protocol)是一種用于從萬維網服務器傳輸超文本到本地瀏覽器的協議。它是無狀態的客戶端-服務器協議,通常在Web瀏覽器和Web服務器之間用于傳輸網頁、圖片、視頻…

西門子 S7-1500 系列 PLC CPU 選型全指南:從類型到實戰

在西門子 S7-1500 系列 PLC 的系統構建中,CPU 作為核心控制單元,其選型直接決定了自動化系統的性能、功能擴展性和適用場景。本文將系統解析 S7-1500 系列 CPU 的類型劃分、核心參數、典型型號功能及選型流程,助你精準匹配工業控制需求。一、…

PaddleOCR 與 PaddleX 調試

PaddleOCR 與 PaddleX 調試1.安裝1.1 環境準備1.2用Conda創建虛擬環境2.測試2.1發票測試2.2 手寫漢字識別3.PaddleOCR 與 PaddleX 對比3.1 基于 PaddleX 部署 OCR 服務1.安裝 PP OCR 文檔 1.1 環境準備 根據自己操作系統按網上指導安裝 ccache ccache --version是否已安裝 …

imx6ull-系統移植篇11——U-Boot 移植(下)

目錄 前言 移植過程 添加開發板默認配置文件 添加開發板對應的頭文件 添加開發板對應的板級文件夾 修改Makefile 文件 修改imximage.cfg 文件 修改Kconfig 文件 修改MAINTAINERS 文件 修改 U-Boot 圖形界面配置文件 編譯 uboot LCD 驅動修改 修改源文件 修改頭文…

30天打牢數模基礎-模擬退火算法講解

二、完整Python代碼 import random import mathdef rastrigin(x, y):"""二維Rastrigin函數(目標函數,需最小化)參數:x: 自變量xy: 自變量y返回:函數值f(x,y)"""return 20 x**2 y**2 …

論文閱讀 - FastInst

文章目錄1 概述2 模型說明2.1 總體架構2.2 輕量pixel decoder2.3 實例激活引導的Query2.4 雙路徑更新策略2.5 GT掩碼引導學習2.6 損失函數3 效果1 概述 FastInst是一種基于query的實時實例分割方法,它能以32.5FPS的實時速度在COCO測試集上達到40.5的AP。在實例分割…

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點)

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點) 1. 集群架構規劃 生產環境中的 Elasticsearch 集群需要高可用性和容錯能力。以下是基于 3 主節點 + 3 數據節點的架構規劃: 節點分布: 主節點(Master Nodes):3 臺(master-node-1, master-node-2, maste…

Unity_通過鼠標點擊屏幕移動屏幕里的一個對象

文章目錄一、獲取到點擊物體的Tansform(摁下鼠標左鍵的瞬間)二、移動點擊的物體(摁著鼠標左鍵不放)三、松開左鍵清理被移動對象屬性總結注:本文章只是學習總結的筆記,視頻鏈接 一、獲取到點擊物體的Tansfor…

UDP中的單播,多播,廣播(代碼實現)

文章目錄1. UDP 單播(Unicast)示例2. UDP 廣播(Broadcast)示例3. UDP 多播(Multicast)示例3.1 多播發送方示例3.2 多播接收方示例總結1. UDP 單播(Unicast)示例 發送方向指定單個目…

神經網絡:卷積層

神經網絡 卷積操作 例子: 輸入:二維圖像 [1,2,0,3,1] [0,1,2,3,1] [1,2,1,0,0] [5,2,3,1,1] [2,1,0,1,1] 卷積核: [1,2,1] [0,1,0] [2,1,0] 然后需要將輸入圖像和卷積核轉化為4維張量 為什么轉為4維張量?因為卷積操作需要輸入圖像…