『PyTorch』第五彈_深入理解Tensor對象_中下:數學計算以及numpy比較
阿新 • • 發佈:2018-02-12
python 輸入 簡單 相對 range pri std lin block
一、簡單數學操作
1、逐元素操作
t.clamp(a,min=2,max=4)近似於tf.clip_by_value(A, min, max),修剪值域。
a = t.arange(0,6).view(2,3) print("a:",a) print("t.cos(a):",t.cos(a)) print("a % 3:",a % 3) # t.fmod(a, 3) print("a ** 2:",a ** 2) # t.pow(a, 2) print("t.clamp(a, min=2, max=4)",t.clamp(a,min=2,max=4))
a: 0 1 2 3 4 5 [torch.FloatTensor of size 2x3] t.cos(a): 1.0000 0.5403 -0.4161 -0.9900 -0.6536 0.2837 [torch.FloatTensor of size 2x3] a % 3: 0 1 2 0 1 2 [torch.FloatTensor of size 2x3] a ** 2: 0 1 4 9 16 25 [torch.FloatTensor of size 2x3] t.clamp(a, min=2, max=4) 2 2 2 3 4 4 [torch.FloatTensor of size 2x3]
2、歸並操作
b = t.ones(2,3) print("b.sum():",b.sum(dim=0,keepdim=True)) print("b.sum():",b.sum(dim=0,keepdim=False))
b.sum(): 2 2 2 [torch.FloatTensor of size 1x3] b.sum(): 2 2 2 [torch.FloatTensor of size 3]
cumsum和cumprob(累加和累乘)屬於特殊的歸並,結果相對於輸入並沒有降維。
3、比較操作
之前有說過,t.max用法較為特殊;而a.topk是個對於深度學習很是方便的函數。
a = t.linspace(0,15,6).view(2,3) print("a:",a) print("a.sort(2):\n",a.sort(dim=1)) # 在某個維度上排序 print("a.topk(2):\n",a.topk(2,dim=1)) # 在某個維度上尋找top-k print("t.max(a):\n",t.max(a)) # 不輸入dim的話就是普通的max print("t.max(a,dim=1):\n",t.max(a,dim=1)) # 輸入dim的話就會集成argmax的功能
a: 0 3 6 9 12 15 [torch.FloatTensor of size 2x3] a.sort(2): ( 0 3 6 9 12 15 [torch.FloatTensor of size 2x3] , 0 1 2 0 1 2 [torch.LongTensor of size 2x3] ) a.topk(2): ( 6 3 15 12 [torch.FloatTensor of size 2x2] , 2 1 2 1 [torch.LongTensor of size 2x2] ) t.max(a): 15.0 t.max(a,dim=1): ( 6 15 [torch.FloatTensor of size 2] , 2 2 [torch.LongTensor of size 2] )
二、Numpy和Tensor
1、數組和張量內存共享
import numpy as np # 數組和Tensor互換 a = t.ones(2,3) b = a.numpy() c = t.from_numpy(b) c[0,0] = 0 print(a)
0 1 1 1 1 1 [torch.FloatTensor of size 2x3]
2、廣播原理及模擬
# 廣播法則 # 1.所有數組向shape最長的數組看齊,不足的在前方補一 # 2.兩個數組要麽在某個維度長度一致,要麽一個為一,否則不能計算 # 3.對長度為一的維度,計算時復制元素擴充至和此維度最長數組一致 a = t.ones(3,2) b = t.ones(2,3,1) print(a + b) # 先a->(1,3,2)然後a,b->(2,3,2)
(0 ,.,.) = 2 2 2 2 2 2 (1 ,.,.) = 2 2 2 2 2 2 [torch.FloatTensor of size 2x3x2]
使用尺寸調整函數模擬廣播過程如下,
# 手工復現廣播過程 # expend可以擴張維度的數字大小,repeat類似,但是expend不會復制數組內存,節約空間 # 被擴充維度起始必須是1才行 print(a.unsqueeze(0).expand(2,3,2) + b.expand(2,3,2)) print(a.view(1,3,2).expand(2,3,2) + b.expand(2,3,2))
(0 ,.,.) = 2 2 2 2 2 2 (1 ,.,.) = 2 2 2 2 2 2 [torch.FloatTensor of size 2x3x2] (0 ,.,.) = 2 2 2 2 2 2 (1 ,.,.) = 2 2 2 2 2 2 [torch.FloatTensor of size 2x3x2]
3、expand方法
我們來看看expand方法,它要求我們的被擴展維度為1才行(如下),如果不是1則擴展失敗。
expand方法不會復制數組,不會占用額外空間,只有在需要時才進行擴展,很節約內存。
a = t.ones(1) print(a.shape) b = a.expand(6) a = 2 print(a)
torch.Size([1]) 21 1 1 1 1 1 [torch.FloatTensor of size 6]
『PyTorch』第五彈_深入理解Tensor對象_中下:數學計算以及numpy比較