本篇介绍tensor的数学运算。
基本运算
- 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 |