張量Tensor是深度學習框架Pytorch中的基礎數據結構。類似于Array是Numpy中的基礎數據結構一樣,tensor及其對應的方法函數,為在Pytorch上進行深度學習建模提供了基本對象和工具。當然,張量的概念并非Pytorch中獨有,目前通用的深度學習框架都擁有張量這一數據結構,但使用方法略有差別。
import torch
import numpy as np
張量的創建
創建方式 |
創建命令 |
通過列表創建 |
t = torch.tensor([1, 2]) |
通過元組創建 |
t = torch.tensor((1, 2)) |
通過數組創建 |
a = np.array([1, 2]) t = torch.tensor(a) |
張量的類型
|
整數型 |
浮點型 |
原生創建(元組或列表) |
int64(長整型) |
float32(單精度) |
Numpy array創建 |
int32(整型) |
float64(雙精度) |
- 除數值型張量外,常用的還有布爾型張量,即構成張量各元素的都是布爾數據類型。
- 可通過dtype參數,在創建張量的時候設置數據類型:
torch.tensor([2.3, 5.9], dtype=torch.int32)
對于已經創建的張量,可以使用 .int()
, .float()
, .double()
等方法來進行類型的轉換。
t = torch.tensor([2, 5])
print(t.dtype)
print(t.float())
print(t.double())
張量的維度
屬性/方法 |
解釋 |
t.ndim |
張量的維度 |
t.shape 或 t.size() |
張量的形狀 |
len(t) |
擁有幾個(N-1)維的元素 |
t.numel() |
擁有幾個數 |
零維張量
可以理解為數學上的一個數,但是擁有張量的屬性。零維張量可以在GPU上運算,而Python原生的數(標量)則不可以。
高維張量
三維及三維以上的張量。
張量的形變
特殊張量的創建
方法 |
解釋 |
torch.zeors() |
全零 |
torch.ones() |
全一 |
torch.eye() |
單位矩陣 |
torch.diag() |
對角矩陣 |
torch.rand() |
0-1分布 |
torch.randn() |
標準正態分布 |
torch.normal() |
正態分布(需輸入mean, std) |
torch.randint() |
隨機整數采樣(范圍需輸入) |
torch.arange() |
生成數列 |
torch.linspace() |
生成數列 |
torch.empty() |
未初始化的矩陣 |
torch.full() |
指定數值填充的矩陣 |
根據現有張量形狀創建
注意與現有張量的數據類型保持一致,否則會報錯。
- torch.randn_like()
- torch.full_like()
- torch.zeros_like()
張量與其他數據類型的轉換
方法 |
解釋 |
t.numpy() 或 np.array(t) |
張量轉換為numpy array |
t.tolist() 或 list(t) |
張量轉換為list |
t.item() |
張量轉換為數值 |
張量的深拷貝
張量的索引
一維張量的索引
- [起始:結束:間隔]
- 起始位包含
- 結束位不包含
- 間隔位置上的數字必須大于0,否則會報錯
t = torch.arange(10)
t[0] # 得到一個零維張量
t[0:3] # 左閉右開
t[1:5:2]
t[::3]
多維張量的索引
- 與一維張量索引類似:[起始:結束:間隔, 起始:結束:間隔, ...]
張量的函數索引
t = torch.arange(10)
indices = torch.tensor([1, 2])
torch.index_select(t, 0, indices)
- torch.index_select() 第二個參數代表索引維度,表示在tensor的哪個維度上進行索引操作。
tensor.view()
tensor.view()相當于給張量提供一個視圖(以不同的形狀觀察張量),給出的結果與原張量共享一個數據存儲空間,因此類似于淺拷貝。
張量的分片函數
張量的分片函數給出的都是原張量的視圖,而非一個新的對象。
t = torch.arange(12).reshape(4, 3)
方法 |
解釋 |
torch.chunk(t, 4, dim=0) |
將t的第0維分成四等分,原張量不能等分時,不會報錯,會返回其他結果 |
torch.split(t, 4, dim=0) |
將t的第0維分成四等分 |
torch.split(t, [1, 3], dim=0) |
將t的第0維按照1/3切分,切分的序列參數之和(此例中為1+3=4)必須等于被切分維度的總長度(此例中tensor t 第0維共有4行) |
張量的合并
方法 |
解釋 |
torch.cat([t1, t2], 0) |
將t1, t2 按維度0進行拼接,拼接后維度不變 |
torch.stack([t1, t2], 0) |
將t1, t2 按維度0進行堆疊,堆疊后的維度將會增加 |
張量維度的變換
方法 |
解釋 |
torch.squeeze(t) |
去除不必要的維度 |
torch.unsqueeze(t, dim=0) |
在維度0上增加一維 |
張量的科學運算
方法 |
解釋 |
torch.add(t1, t2) |
t1 + t2 |
torch.subtract(t1, t2) |
t1 - t2 |
torch.multiply(t1, t2) |
t1 * t2 |
torch.divide(t1, t2) |
t1 / t2 |
torch.abs(t) |
取絕對值 |
torch.ceil(t) |
向上取整 |
torch.floor(t) |
向下取整 |
torch.round(t) |
四舍五入取整 |
torch.neg(t) |
取反 |
torch.exp(t) |
 |
torch.expm1(t) |
- 1 |
torch.exp2(t) |
 |
torch.pow(t,n) |
 |
torch.sqrt(t) |
 |
torch.square(t) |
 |
torch.log10(t) |
) |
torch.log(t) |
) |
torch.log2(t) |
) |
torch.log1p(t) |
) |
torch.sin(t) |
) |
torch.cos(t) |
) |
torch.tan(t) |
) |
torch.mean(t) |
均值 |
torch.var(t) |
方差 |
torch.std(t) |
標準差 |
torch.var_mean(t) |
方差和均值 |
torch.std_mean(t) |
標準差和均值 |
torch.max(t) |
最大值 |
torch.argmax(t) |
最大值索引 |
torch.min(t) |
最小值 |
torch.argmin(t) |
最小值索引 |
torch.median(t) |
中位數 |
torch.sum(t) |
求和 |
torch.logsumexp(t) |
求和,適用于數據量較小的情況 |
torch.prod(t) |
累乘 |
torch.dist(t1, t2) |
計算兩個張量的閔式距離,可使用不同范式 |
torch.topk(t) |
返回t中最大的k個值對應的指標 |
torch.eq(t1, t2) |
比較t1、t2各元素是否相等,等效== |
torch.equal(t1, t2) |
判斷兩個張量是否是相同的張量 |
torch.gt(t1, t2) |
比較t1各元素是否大于t2各元素,等效> |
torch.lt(t1, t2) |
比較t1各元素是否小于t2各元素,等效< |
torch.ge(t1, t2) |
比較t1各元素是否大于或等于t2各元素,等效>= |
torch.le(t1, t2) |
比較t1各元素是否小于等于t2各元素,等效<= |
torch.ne(t1, t2) |
比較t1、t2各元素是否不相同,等效!= |
張量的線性代數運算
方法 |
解釋 |
torch.t(t) |
轉置 |
torch.eye(n) |
創建包含n個分量的單位矩陣 |
torch.diag(t) |
以t中各元素,創建對角矩陣 |
torch.triu(t) |
取矩陣t中的上三角矩陣 |
torch.tril(t) |
取矩陣t中的下三角矩陣 |
torch.dot(t1, t2) |
t1、t2 內積 |
torch.mm(t1, t2) |
矩陣乘法 |
torch.mv(t1, t2) |
矩陣乘向量 |
torch.bmm(t1, t2) |
批量矩陣乘法 |
torch.addmm(t, t1, t2) |
矩陣相乘后相加 |
torch.addbmm(t, t1, t2) |
批量矩陣相乘后相加 |
torch.trace(A) |
矩陣的跡 |
torch.matrix_rank(A) |
矩陣的秩 |
torch.det(A) |
計算矩陣A的行列式 |
torch.inverse(A) |
矩陣求逆 |
torch.lstsq(A,B) |
最小二乘法 |
torch.eig(A, eigenvectors=True) |
矩陣的特征值,特征向量 |
torch.svd(C) |
SVD分解 |
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。