pytoch矩阵运算问题(后续学习遇到有关问题,会继续在这里更新)
(矩阵相乘)
(torch.mm())
这个函数就是我们普通的矩阵相乘,相乘的矩阵shape必须匹配,例如1* 3的矩阵必须要乘以3* x的矩阵(x代表任意大小),例子如下:
import torch
a=torch.tensor([[1,2,3]],dtype=torch.float)
b=torch.tensor([[1],[2],[4]],dtype=torch.float)
c=torch.mm(a,b)
print(c)
输出结果如下:
tensor([[17.]])
17就等于1* 1+2* 2+3* 4=17
(torch.mul()和 运算符 *)
这个函数就是我们所说的element wise 即对应位置元素相乘,例子如下:
import torch
a=torch.tensor([[1,2,3]],dtype=torch.float)
b=torch.tensor([1,2,4],dtype=torch.float)
c=torch.mul(a,b)
print(c)
输出结果如下:
tensor([[ 1., 4., 12.]])
结果中的1就是a中的第一个数1与b中第一个数相乘的结果,4就是a中的第二个数2与b中第二个数2相乘的结果.
对于element wise 我们也可以直接用*代替torch.mul(),例如:
import torch
a=torch.tensor([[1,2,3]],dtype=torch.float)
b=torch.tensor([1,2,4],dtype=torch.float)
c=a*b
print(c)
结果如下:
tensor([[ 1., 4., 12.]])
可以看到结果是一样的。
对于torch.mul()并不要求shape完全一样才能进行运算(运算符* 也同样),例如:
import torch
a=torch.tensor([[1,2,3]],dtype=torch.float)
b=torch.tensor([[1],[2],[4]],dtype=torch.float)
c=torch.mul(a,b)
print(c)
结果如下:
tensor([[ 1., 2., 3.],
[ 2., 4., 6.],
[ 4., 8., 12.]])
可以看到1* 3的矩阵与3* 1的矩阵进行运算时会输出一个3* 3矩阵,即将a的第一行中所有的数与b中的第一行相乘将输出结果作为c的第一行,将a的第二行中所有的数与b中的第二行相乘将输出结果作为c的第二行,将a的第三行中所有的数与b中的第三行相乘将输出结果作为c的第三行
import torch
x1=torch.tensor([[[[-1,2,3,4],
[4,3,2,1],
[1,2,3,4],
[4,3,2,1]],
[[1, 2, 3, 4],
[4, 3, 2, 1],
[1, 2, 3, 4],
[4, 3, 2, 1]],
[[-1, 2, 3, 4],
[4, 3, 2, 1],
[1, 2, 3, 4],
[4, 3, 2, 1]]]],dtype=torch.float,requires_grad=True)
x2=torch.tensor([[-1,0.5,3,4],
[4,3,2,1],
[1,2,3,4],
[4,3,2,1]])
print(x1*x2)
以上代码输出为:
C:\software\Anaconda3\python.exe "D:/SZ/runned code/gradreserach.py"
tensor([[[[ 1., 1., 9., 16.],
[16., 9., 4., 1.],
[ 1., 4., 9., 16.],
[16., 9., 4., 1.]],
[[-1., 1., 9., 16.],
[16., 9., 4., 1.],
[ 1., 4., 9., 16.],
[16., 9., 4., 1.]],
[[ 1., 1., 9., 16.],
[16., 9., 4., 1.],
[ 1., 4., 9., 16.],
[16., 9., 4., 1.]]]], grad_fn=<MulBackward0>)
可以看出x2会分别与x1中的数做element wise 然后输出。这在像素注意力机制中会使用到。
(矩阵相除)
(运算符 /)
运算符/效果和运算符*效果相同,例子如下:
import torch
a=torch.tensor([[1,2,3]],dtype=torch.float)
b=torch.tensor([1,2,4],dtype=torch.float)
c=a/b
print(c)
结果如下:
tensor([[1.0000, 1.0000, 0.7500]])
可以看到结果等于对1/b和a做element wise,即有a/b=a*(1/b)
运算符>或<
会对矩阵进行判断,然后输出TRUE OR FALSE
c=torch.floor(torch.tensor([1.1,2.2,3.7]))
print(c>0)
输出:
tensor([1, 1, 1], dtype=torch.uint8)
运算符| 代表或 运算符&代表与
aa=torch.tensor([1,2,3,4,5])
a=torch.tensor([-1,2,3,4,5])
print((aa>0)|(a>0))
输出是:
tensor([True, True, True, True, True])
aa=torch.tensor([1,2,3,4,5])
a=torch.tensor([-1,2,3,4,5])
print((aa>0)&(a>0))
输出是
tensor([False, True, True, True, True])