pytorch中同维度张量matmul运算

pytorch中同维度张量matmul运算

零维矩阵乘法

零维矩阵乘法实际上就是标量(数的)乘法。

import torch
M01=torch.tensor(3)
M02=torch.tensor(5)
M01.size()
res=M01.matmul(M02)
print(res)
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-8-dedd77923e8a> in <module>
      1 M01.size()
----> 2 res=M01.matmul(M02)
      3 print(res)

RuntimeError: both arguments to matmul need to be at least 1D, but they are 0D and 0D

因此可以知道零维矩阵乘法无法实现,在torch的matmul运算中至少要保证一维度维矩阵。

一维矩阵乘法

一维矩阵的乘法实际上就是数学上两个向量的点积运算,在torch的运算中可以输入行向量不需要转置。

M11=torch.tensor([3,5,7])
M12=torch.tensor([5,1,2])
print(M11.size())
res=M11.matmul(M12)
print(res)
torch.Size([3])
tensor(34)

二维矩阵的乘法

二维矩阵的乘法实际上就是数学上两个矩阵乘法运算。

M11=torch.tensor([[3,5,2],[3,1,2]])
M12=torch.tensor([[2,1,2],[1,4,2]]).t()
print(M11.size())
print(M12.size())
res=M11.matmul(M12)
print(res)
torch.Size([2, 3])
torch.Size([3, 2])
tensor([[15, 27],
        [11, 11]])

三维矩阵的乘法

M11=torch.tensor([[[3,5,2],[3,1,2]],[[3,1,2],[3,1,2]],[[1,2,2],[2,2,3]]])
M12=torch.tensor([[[2,1],[1,4],[2,1]],[[2,1],[1,4],[2,3]],[[2,1],[1,4],[1,2]]])
print(M11.size())
print(M12.size())
res=M11.matmul(M12)
print(res)
torch.Size([3, 2, 3])
torch.Size([3, 3, 2])
tensor([[[15, 25],
         [11,  9]],

        [[11, 13],
         [11, 13]],

        [[ 6, 13],
         [ 9, 16]]])

pytorch在计算三维矩阵的乘法的时候采用矩阵运算的批处理模式,对于dim=0的维度必须保证是一样的(上面第一个3),在该维度下进行批为3的批处理矩阵运算。矩阵运算的为dim=1dim=2维度形成的二维矩阵,因此必须该两个二维相乘必须满足矩阵的乘法上面的(2$\times 3 与 3 3与3 33\times$2)。即在dim=0上从两个张量中各取一个二维矩阵进行运算得到一个结果矩阵,遍历dim=0所有个数将得到一个结果矩阵组成一个新的三维张量。

四维矩阵的乘法

M11=torch.tensor([[[[3,5,2],[3,1,2]],[[3,1,2],[3,1,2]],[[1,2,2],[2,2,3]]],[[[3,5,2],[3,1,2]],[[3,1,2],[3,1,2]],[[1,2,2],[2,2,3]]]])
M12=torch.tensor([[[[2,1],[1,4],[2,1]],[[2,1],[1,4],[2,3]],[[2,1],[1,4],[1,2]]],[[[2,1],[1,4],[2,1]],[[2,1],[1,4],[2,3]],[[2,1],[1,4],[1,2]]]])
print(M11.size())
print(M12.size())
res=M11.matmul(M12)
print(res)
torch.Size([2, 3, 2, 3])
torch.Size([2, 3, 3, 2])
tensor([[[[15, 25],
          [11,  9]],

         [[11, 13],
          [11, 13]],

         [[ 6, 13],
          [ 9, 16]]],


        [[[15, 25],
          [11,  9]],

         [[11, 13],
          [11, 13]],

         [[ 6, 13],
          [ 9, 16]]]])

同样pytorch在计算四维矩阵的乘法的时候采用批处理模式,对于dim=0dim=1的维度必须保证是一样的。矩阵运算的为dim=3dim=2维度形成的二维矩阵。即在dim=0dim=1上从两个张量中各取一个二维矩阵进行运算得到一个结果矩阵,遍历dim=0dim=1所有个数将得到一个结果矩阵组成一个新的四维张量。

总结

对于同维度张量相乘,对于每个维度而言可以看成两个部分,即批处理遍历部分和二维矩阵乘法部分。二维矩阵乘法表示两个张量最后两维度的大小必须满足矩阵的乘法;批处理遍历部分表示两个张量除去最后两维度外必须相等且批处理计算时由低维度到高纬度依次遍历,形成新张量。输入张量 M 1 ( m 0 , m 1 , m 2 , . . . , m n − 2 = p , m n − 1 = q ) × M 2 ( m 0 , m 1 , m 2 , . . . , m n − 2 = q , m n − 1 = r ) M_1(m_0,m_1,m_2,...,m_{n-2}=p,m_{n-1}=q)\times M_2(m_0,m_1,m_2,...,m_{n-2}=q,m_{n-1}=r) M1(m0,m1,m2,...,mn2=p,mn1=q)×M2(m0,m1,m2,...,mn2=q,mn1=r)
输出张量

R e s ( m 0 , m 1 , m 2 , . . . , m n − 2 = p , m n − 1 = r ) Res(m_0,m_1,m_2,...,m_{n-2}=p,m_{n-1}=r) Res(m0,m1,m2,...,mn2=p,mn1=r)

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中,可以使用多种方法对张量维度进行变换。其中常用的方法有view()和squeeze()。view()方法可以用来改变张量的形状,而squeeze()方法可以去除维度中值为1的尺寸。举例如下: 1. 使用view()方法进行维度变换。view()方法会返回一个改变了形状的新张量,但张量中的元素数量必须保持不变。可以使用该方法实现维度的展平、增加或减少维度等操作。 2. 使用squeeze()方法进行维度变换。squeeze()方法可以去除张量维度中值为1的尺寸,并返回一个新张量。可以指定具体的维度进行去除,也可以不指定维度,即默认去除所有为1的维度。 例如,假设有一个张量a的形状为(2, 1, 2, 1, 3),使用squeeze()方法可以去除其中值为1的维度,得到一个形状为(2, 2, 3)的新张量。 在PyTorch中,还可以使用unsqueeze()方法对张量进行维度扩展。unsqueeze()方法会在指定的维度上增加一个尺寸为1的维度,并返回一个新张量。 总结起来,PyTorch中的维度变换包括view()、squeeze()和unsqueeze()等方法,可以根据具体需求选择合适的方法进行张量维度变换。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PyTorch中Tensor的维度变换实现](https://download.csdn.net/download/weixin_38698174/13988496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Pytorch 基础之维度变化](https://blog.csdn.net/zxhandroid/article/details/129192950)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值