Tensor概念和建立
Tensor的概念
張量是一個多維陣列,它是標量、向量、矩陣的高維拓展。
Tensor與Variable
Variable是torch.autograd中的資料型別
主要用於封裝Tensor,進行自動求導
- data: 被包裝的Tensor
- grad: data的梯度
- grad_fn: 建立Tensor的Function,是自動求導的關鍵
- requires_grad: 指示是否需要梯度
- is_leaf: 指示是否是葉子結點(張量)
PyTorch0.4.0版開始,Variable併入Tensor
- dtype: 張量的資料型別,如torch.FloatTensor,torch.cuda.FloatTensor
- shape: 張量的形狀,如(64,3,224,224)
- device:張量所在裝置,GPU/CPU,是加速的關鍵
Tensor建立
直接建立
torch.tensor
torch.tensor()
功能:從data建立tensor
- data: 資料,可以是list,numpy
- dtype: 資料型別,預設與data的一致
- device: 所在裝置,cuda/cpu
- requires_grad:是否需要梯度
- pin_memory:是否存於鎖頁記憶體
import torch import numpy as np torch.manual_seed(1) # =============================== exmaple 1 =============================== # 通過torch.tensor建立張量 # # flag = True flag = False if flag: arr = np.ones((3, 3)) print("ndarray的資料型別:", arr.dtype) t = torch.tensor(arr, device='cuda') # t = torch.tensor(arr) print(t)
torch.from_numpy
torch.from_numpy(ndarray)
功能:從numpy建立tensor
注意事項:從torch.from_numpy建立的tensor與原ndarray共享記憶體,當修改其中一個的資料,另外一個也將會被改動
# 通過torch.from_numpy建立張量 # flag = True flag = False if flag: arr = np.array([[1, 2, 3], [4, 5, 6]]) t = torch.from_numpy(arr) # print("numpy array: ", arr) # print("tensor : ", t) # print("\n修改arr") # arr[0, 0] = 0 # print("numpy array: ", arr) # print("tensor : ", t) print("\n修改tensor") t[0, 0] = -1 print("numpy array: ", arr) print("tensor : ", t)
依據數值建立
torch.zeros
torch.zeros()
功能:依size建立全0張量
- size: 張量的形狀,如(3,3)、(3,224,224)
- out: 輸出的張量
- layout: 記憶體中佈局形式,有strided,sparse_coo等
- device: 所在裝置,gpu/cpu
- requires_grad:是否需要梯度
# 通過torch.zeros建立張量
# flag = True
flag = False
if flag:
out_t = torch.tensor([1])
t = torch.zeros((3, 3), out=out_t)
print(t, '\n', out_t)
print(id(t), id(out_t), id(t) == id(out_t))
torch.zeros_like
torch.zeros_like()
功能:依input形狀建立全0張量
- intput: 建立與input同形狀的全0張量
- dtype: 資料型別
- layout: 記憶體中佈局形式
torch.ones和torch.ones_like
torch.ones()
torch.ones_like()
功能:依input形狀建立全1張量
- size: 張量的形狀,如(3,3)、(3,224,224)
- dtype: 資料型別
- layout: 記憶體中佈局形式
- device: 所在裝置,gpu/cpu
- requires_grad: 是否需要梯度
torch.full與torch.full_like
torch.full()
torch.full_like()
功能:依input形狀建立指定資料的張量
- size: 張量的形狀,如(3,3)
- fill_value: 張量的值
# 通過torch.full建立全1張量
# flag = True
flag = False
if flag:
t = torch.full((3, 3), 1)
print(t)
torch.arange
torch.arange()
功能:建立等差的1維張量注意事項:數值區間為[start,end)
- start: 數列起始值
- end: 數列“結束值”
- step: 數列公差,預設為1
# 通過torch.arange建立等差數列張量
# flag = True
flag = False
if flag:
t = torch.arange(2, 10, 2)
print(t)
torch.linspace
torch.linspace()
功能:建立均分的1維張量注意事項:數值區間為[start,end]
- start: 數列起始值
- end: 數列結束值
- steps: 數列長度
# 通過torch.linspace建立均分數列張量
# flag = True
flag = False
if flag:
# t = torch.linspace(2, 10, 5)
t = torch.linspace(2, 10, 6)
print(t)
torch.logspace
torch.logspace()
功能:建立對數均分的1維張量注意事項:長度為steps,底為base
- start: 數列起始值
- end: 數列結束值
- steps: 數列長度
- base: 對數函式的底,預設為10
torch.eye
torch.eye()
功能:建立單位對角矩陣(2維張量)注意事項:預設為方陣
- n: 矩陣行數
- m: 矩陣列數
依據概率建立
torch.normal
torch.normal()
功能:生成正態分佈(高斯分佈)
- mean: 均值
- std: 標準差
四種模式:
- mean為標量,std為標量
- mean為標量, std為張量
- mean為張量,std為標量
- mean為張量,std為張量
# 通過torch.normal建立正態分佈張量
flag = True
# flag = False
if flag:
# mean:張量 std: 張量
# mean = torch.arange(1, 5, dtype=torch.float)
# std = torch.arange(1, 5, dtype=torch.float)
# t_normal = torch.normal(mean, std)
# print("mean:{}\nstd:{}".format(mean, std))
# print(t_normal)
# mean:標量 std: 標量
# t_normal = torch.normal(0., 1., size=(4,))
# print(t_normal)
# mean:張量 std: 標量
mean = torch.arange(1, 5, dtype=torch.float)
std = 1
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)
torch.randn
torch.randn()
torch.randn_like()
功能:生成標準正態分佈
- size: 張量的形狀
torch.rand和torch.randint
torch.rand()
torch.rand_like()
功能:在區間[0,1)上,生成均勻分佈torch.randint()
torch.randint_like()功能:區間[low,high)生成整數均勻分佈
- size:張量的形狀
torch.randperm和torch.bernoulli
torch.randperm()
功能:生成生成從0到n-1的隨機排列
- n:張量的長度3.9
torch.bernoulli()
功能:以input為概率,生成伯努力分佈(0-1分佈,兩點分佈)
- input:概率值