tensor(張量)是PyTorch的一種數據類型,可以是標量、一維向量、多維矩陣等。
上圖中types可以不同(dtype不設定就是同類型),並沒有嚴格界限,不過最好按推薦的情況去使用。
tensor.*中tensor就是帶有數據的具體對象了,如下述案例中x、y等。
1、Tensor與tensor區別
import torch as t x=t.Tensor(2,3) #2行3列 x=t.Tensor([2,3]) #浮點型,輸出 tensor([2., 3.]) #tensor里是已存在的數據,標量、向量、矩陣等。注意與Tensor區別 x=t.tensor([2,3]) #與元素同類型,整型 x=t.tensor([2.,3.]) #浮點型
torch.Tensor()是python類,更明確地說,是默認張量類型torch.FloatTensor()的別名,torch.Tensor([1,2])會調用Tensor類的構造函數__init__,生成單精度浮點類型的張量。
torch.tensor()是函數,返回的張量類型與元素同類型。
詳解鏈接https://blog.csdn.net/tfcy694/article/details/85338745
2、torch.*
#未初始化的,里面是垃圾值 x=t.empty(2,3) x #類似的還有ones x=t.zeros(2,3,dtype=t.long) x #[0,1]均勻分布,randn是高斯分布 x=t.rand(2,3) x
3、torch.*_like、torch.new_*
#與x等大,類型不同(若設定) y=t.zeros_like(x,dtype=t.float) y #y與x不等大,同類型(若不設定) y=x.new_zeros(3,2) #y.type() #y.size() y
注意,如果報錯,一般是因為類型不是Tensor默認的浮點型,轉換下就可以了
其他總結:
import torch as t a=t.arange(0,5,2) #步長為2的等差數列,左閉右開 b=t.linspace(0,5,3) #指定間隔范圍內返回均勻間隔的數字 c1=t.randn(2,3) #標准正太分布 c2=t.rand(2,3) #0-1的均勻隨機分布 d=t.randperm(3) #長度為3的隨機排列,從0開始 e=t.eye(2,3) #對角線為1的矩陣,行列數可以不一致 print("a",a) print("b",b) print("c1",c1) print("c2",c2) print("d",d) print("e",e)
view調整形狀:
a=t.arange(0,6) print(a) b=a.view(2,-1) #調整形狀,-1自動計算列數。注意b與a同一內存 print(b) c=b.view(1,1,2,-1) #2維變4維 print(c) c.size()
索引:
a=t.randn(3,4) a[0] #第1行 a[:,0] #第1列 a[0,2] #第1行3列的元素 a[0,-1] #第1行最后1列的元素 a[:2] #前2行,左閉右開,即0、1行 #都是第1行前2列,但形狀不同 print(a[0,:2]) #1維 print(a[0:1,:2]) #2維,1*2 x=t.arange(0,27).view(3,3,3) #3*3*3 x[[1,2],[1,2],[2,0]] # x[[1,1,2],[2,2,0]] x[[2,1,0],[0],[1]] #x[[2,0,1],[1,0,1],[0,0,1]]
按條件選取元素
a=t.randn(3,4) a[a>1] #選取大於1的元素 a[a!=0]
tensor函數
a=t.arange(0.,6.).view(2,-1) #注意浮點型 t.cos(a) #余弦,整型會報錯 t.fmod(a,3) #取余,a%3 t.pow(a,2) #次冪,a**2 t.clamp(a,min=3) #低於3的置為3 t.clamp(a,min=2,max=4) #低於2的置為2,高於4的置為4 #類似函數還有,abs、sqrt、ceil/round/floor/trunc上取整/四舍五入/下取整/只留整數部分
歸並操作:
mean/sum/median/mode 均值/和/中位數/眾數
norm/dist 范數/距離
std/var 標准差/方差
cumsum/cumprod 累加/累乘
以上函數大多有dim這個參數,dim設置規律如下:
對於形狀(m,n,k),
dim=0,則輸出形狀(1,n,k)或(n,k)
dim=1,則輸出形狀(m,1,k)或(m,k)
dim=2,則輸出形狀(m,n,1)或(m,n)
有無1,取決於參數keepdim,keepdim=True則保留維度1,默認是False。
b=t.ones(2,3) print(b.sum(dim=0,keepdim=True)) #1*3,二維 print(b.sum(dim=0)) #3,注意不是1*3,一維 print(b.sum(dim=1)) #對於二維矩陣:dim=0累加列。dim=1累加行。
矩陣運算:
注意,轉置會使得內存空間不連續。
a=t.linspace(0,15,6).view(2,-1) b=a.t() print(b.is_contiguous()) #轉置后b的內存空間是不連續的 c=b.contiguous() #重新分配新的連續的空間c,b依然是不連續的。 print(b.is_contiguous()) print(c.is_contiguous())