引言
基本運算
- add/minus/multiply/divide
- matmul
- pow
- sqrt/rsqrt
- round
基礎運算
- 可以使用 + - * / 推薦
- 也可以使用 torch.add, mul, sub, div
1 |
In[3]: a = torch.rand(3,4) |
-
torch.all()判斷每個位置的元素是否相同是否存在為0的元素
1
2
3
4In[21]: torch.all(torch.ByteTensor([1,1,1,1]))
Out[21]: tensor(1, dtype=torch.uint8)
In[22]: torch.all(torch.ByteTensor([1,1,1,0]))
Out[22]: tensor(0, dtype=torch.uint8)
matmul
- matmul 表示 matrix mul
*表示的是element-wisetorch.mm(a,b)只能計算2D 不推薦torch.matmul(a,b)可以計算更高維度,落腳點依舊在行與列。 推薦@是matmul 的重載形式
1 |
In[24]: a = 3*torch.ones(2,2) |
例子
線性層的計算 : x @ w.t() + b
- x是4張照片且已經打平了 (4, 784)
- 我們希望 (4, 784) —> (4, 512)
- 這樣的話w因該是 (784, 512)
- 但由於pytorch默認 第一個維度是 channel-out(目標), 第二個維度是 channel-in (輸入) , 所以需要用一個轉置
note:.t() 只適合2D,高維用transpose
1 |
In[31]: x = torch.rand(4,784) |
神經網絡 -> 矩陣運算 -> tensor flow
2維以上的tensor matmul
- 對於2維以上的matrix multiply ,
torch.mm(a,b)就不行了。 - 運算規則:只取最后的兩維做矩陣乘法
- 對於 [b, c, h, w] 來說,b,c 是不變的,圖片的大小在改變;並且也並行的計算出了b,c。也就是支持多個矩陣並行相乘。
- 對於不同的size,如果符合broadcast,先執行broadcast,在進行矩陣相乘。
1 |
In[3]: a = torch.rand(4,3,28,64) |
power
- pow(a, n) a的n次方
**也表示次方(可以是2,0.5,0.25,3) 推薦- sqrt() 表示 square root 平方根
- rsqrt() 表示平方根的倒數
1 |
In[11]: a = torch.full([2,2],3) |
Exp log
- exp(n) 表示:e的n次方
- log(a) 表示:ln(a)
- log2() 、 log10()
1 |
In[18]: a = torch.exp(torch.ones(2,2)) |
Approximation
近似相關1
- floor、ceil 向下取整、向上取整
- round 4舍5入
- trunc、frac 裁剪
1 |
In[24]: a = torch.tensor(3.14) |
clamp
近似相關2 (用的更多一些)
- gradient clipping 梯度裁剪
- (min) 小於min的都變為某某值
- (min, max) 不在這個區間的都變為某某值
- 梯度爆炸:一般來說,當梯度達到100左右的時候,就已經很大了,正常在10左右,通過打印梯度的模來查看
w.grad.norm(2) - 對於w的限制叫做weight clipping,對於weight gradient clipping稱為 gradient clipping。
1 |
In[30]: grad = torch.rand(2,3)*15 |
