pytorch矩阵运算问题

(矩阵相乘)

(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])
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

种树家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值