PyTorch 第一章第二節:張量簡介與建立
阿新 • • 發佈:2020-12-10
技術標籤:pytorch
張量是什麼?
- 標量:0維張量
- 向量:1維張量
- 矩陣:2維張量
- 3維張量 RGB
- n維張量
張量是一個多維陣列,它是標量、向量、矩陣的高維拓展
Tensor 與Variable
Variable
Variable是torch.autograd中的資料型別,主要用於封裝Tensor,進行自動求導
- data:被包裝的Tensor
- grad:data的梯度
- grad_fn:建立Tensor的Function,是自動求導的關鍵
- requires_grad:指示是否需要梯度
- is_leaf:指示是否是葉子結點(張量)
Tensor
PyTorch0.4.0版本開始,Variable併入Tensor
- dtype:張量的資料型別,如torch.FloatTensor,torch.cuda.FloatTensor
- shape:張量的形狀,如(64,3,224,224)
- device:張量所在裝置,GPU/CPU,是加速的關鍵
張量的建立
一、直接建立
- torch.tensor()
功能:從data建立tensor
data:資料,可以是list,numpy
dtype:資料型別,預設與data的一致
device:所在裝置,cuda/CPU
requires_grad:是否需要梯度
pin_memory:是否存於鎖頁記憶體
torch.tensor(
data,
dtype=None,
device=None,
requires_grad=Flase,
pin_memory=False)
arr=np.ones((3,3))
print('ndarray的資料型別:',arr.dtype)
t=torch.tensor(arr)
#t=torch.tensor(arr,device="cuda") # 輸出結果慢些,放在GPU上
print(t)
#結果:資料型別是float64,t是3x3的張量
- torch.from_numpy(ndarray)
功能:從numpy建立Tensor
注意事項:從torch.from_numpy建立的Tensor與原ndarray共享記憶體,當修改其中一個的資料,另一個也將會被改動
arr=np.array([1,2,3],[4,5,6])
t=toch.from_numpy(arr)
print('numpy array:',arr)
print('tensor:',t)
#改變arr 看Tensor是否改變
print('\n修改arr')
arr[0,0]=0
print('numpy array:',arr)
print('tensor:',t)
#改變Tensor 看arr是否改變
print('\n修改Tensor')
t[0,0]=0
print('numpy array:',arr)
print('tensor:',t)
二、依據資料值建立
- torch.zeros()
功能:依size建立全0張量
size:張量的形狀,如(3,3)、(3,224,224)
out:輸出的張量
layout:記憶體中佈局形式,有strided,sparse_coo等
device:所在裝置,gou/cpu
requires_grad:是否需要梯度
torch.zeros(
*size,
out=None,
dtype=None,
layout=torch.strided,
device=None
requires_grad=None)
out_t=tourch.tensor([1])
t=torch.zeros((3,3),out=out_t)#將torch.zeros生成的張量賦值給out_t
print(t,'\n',out_t)
print(id(t),id(out_t),id(t)==id(out_t))
- torch.zeros_like()
功能:依據input形狀建立全0張量
input:建立與input同形狀的全0張量
dtype:資料型別
layout:記憶體中佈局形式
torch.zeros_like(
input,
dtype=None,
layout=None,
device=None,
requires_grad=Flase)
- torch.ones()
- torch.ones_like()
功能:依據input形狀建立全1張量
size:張量的形狀,如(3,3)、(3,224,224)
out:輸出的張量
layout:記憶體中佈局形式,有strided,sparse_coo等
device:所在裝置,gou/cpu
requires_grad:是否需要梯度
torch.ones(*size,
out=None,
dtype=None,
layout=torch.strided,
device=None
requires_grad=None)
torch.ones_like(input,
dtype=None,
layout=None,
device=None,
requires_grad=Flase)
- torch.full()
- torch.full_like()
功能:依據input形狀建立全0張量
size:張量的形狀,如(3,3)
fill_value:張量的值
torch.full(size,
fill_value,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=Flase)
t=torch.full((3,3),10)
print(t)
#結果:3x3全為10的張量
- torch.arange()
功能:建立等差的1維張量
注意事項:數值區間為[start,end)
start:數列起始值
end:數列“結束值”
step:數列公差,預設為1
torch.arange(start=0,
end,
step=1,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
t=torch.arange(2,10,2)
print(t)
- torch.linspace()
功能:建立均分的1維張量
注意事項:數值區間為[start,end]
start:數列起始值
end:數列結束值
steps:數列長度
torch.linspace(start,
end,
steps=100,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
t=torch.linspace(2,10,5)
#rch.linspace(2,10,6)#(10-2)/(6-1)=1.6
print(t)#2,4,6,8,10的張量
- torch.logspace()
功能:建立對數均分的1維張量
注意事項:長度為steps,底為base
start:數列起始值
end:數列結束值
steps:數列長度
base:對數函式的底,預設為10
torch.logspace(start,
end,
steps=100,
base=10.0
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
10.torch.eye()
功能:建立單位為對角矩陣(2維張量)
注意事項:預設為方陣
n:矩陣行數
m:矩陣列數
torch.eye(n,
m=None,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
三、依據概率分佈建立張量
- torch.nomal()
功能:生成正態分佈(高斯分佈)
mean:均值
std:標準差
四種模式:
mean為標量,std為標量
mean為標量,std為張量
mean為張量,std為標量
mean為張量,std為張量
torch.normal(mean,
std,
out=None)
torch.normal(mean,
std,
size,
out=None)
#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,1))
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_like()
功能:生成標準正態分佈
size:張量的形狀
torch.randn(*size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
- torch.rand()
- torch.rand_like()
功能:在區間[0,1),生成均勻分佈 - torch.randint()
- torch.randint_like()
功能:區間[low,high)生成整數均勻分佈
size:張量的形狀
torch.rand(*size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
torch.randint(low=0,
high,
size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
- torch.randperm()
功能:生成從0到n-1的隨機排列
n:張量的長度 - torch.bernoulli()
功能:以input為概率,生成伯努利分佈
(0-1分佈,兩點分佈)
input:概率值
torch.randperm(n,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
torch.brenoulli(input,
*,
generator=None,
out=None)