1. 程式人生 > 其它 >PyTorch 第一章第二節:張量簡介與建立

PyTorch 第一章第二節:張量簡介與建立

技術標籤: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,是加速的關鍵

張量的建立
一、直接建立

  1. 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的張量
  1. 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)

二、依據資料值建立

  1. 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))
  1. torch.zeros_like()
    功能:依據input形狀建立全0張量
    input:建立與input同形狀的全0張量
    dtype:資料型別
    layout:記憶體中佈局形式
torch.zeros_like(
				input,
				dtype=None,
				layout=None,
				device=None,
				requires_grad=Flase)
  1. torch.ones()
  2. 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)
  1. torch.full()
  2. 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的張量
  1. 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)
  1. 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的張量

  1. 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)

三、依據概率分佈建立張量

  1. 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)
  1. torch.randn()
  2. torch.randn_like()
    功能:生成標準正態分佈
    size:張量的形狀
torch.randn(*size,
		out=None,
		dtype=None,
		layout=torch.strided,
		device=None,
		requires_grad=False)
  1. torch.rand()
  2. torch.rand_like()
    功能:在區間[0,1),生成均勻分佈
  3. torch.randint()
  4. 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)
  1. torch.randperm()
    功能:生成從0到n-1的隨機排列
    n:張量的長度
  2. 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)