【详解】神经网络矩阵的点乘与叉乘(pytorch版)

官方文档


太长不看版本

  1. 点乘为两个矩阵对应元素相乘(逐元素级element-wise)
    实现方式:可以通过*和torch.mul(x, y)函数实现(含广播机制)
    模型符号:一个圆圈中有一个实心点
  2. 叉乘为传统的线性代数学的矩阵乘法
    实现方式:可以通过torch.mm()和torch.matmul()实现(含广播机制)
    模型符号:一个圆圈中有一个叉×
  3. 逐元素相加
    实现方式:可以通过+和torch.add(x, y)函数实现
    模型符号:一个圆圈中有一个加号+

广播机制:如果PyTorch操作支持广播,则其Tensor参数可以自动扩展为相等大小(无需复制数据)
如果张量x和y可以符合广播的条件,那么:结果张量可以按照下面的方式计算:
1、如果x和y的维度不相同,用1来扩张维度少的那个,使两个张量维度一致。
2、对于每个维度,结果维度是x,y对应维度的最大值。
即:列向量按列扩充,行向量按行扩充,使两个tensor扩展为相同尺寸,进行对应元素相乘。


一、点乘

点乘就是对应位置元素相乘(element-wise),可以通过*和torch.mul()函数实现,在神经网络模型中的符号为:
点乘的模型简化符号

1.1 标量的点乘

示例:
a = torch.randint(10,(3,3))
print(a)
print(a*2)
print(a.mul(a))
输出:
tensor([[9, 3, 1],
        [3, 7, 3],
        [4, 8, 3]])
tensor([[18,  6,  2],
        [ 6, 14,  6],
        [ 8, 16,  6]])
tensor([[81,  9,  1],
        [ 9, 49,  9],
        [16, 64,  9]]

1.2 向量的点乘(含广播机制BroadCasting)

广播机制:如果PyTorch操作支持广播,则其Tensor参数可以自动扩展为相等大小(无需复制数据)
如果张量x和y可以符合广播的条件,那么:结果张量可以按照下面的方式计算:
1、如果x和y的维度不相同,用1来扩张维度少的那个,使两个张量维度一致。
2、对于每个维度,结果维度是x,y对应维度的最大值。
即:列向量按列扩充,行向量按行扩充,使两个tensor扩展为相同尺寸,进行对应元素相乘。

示例:
b = torch.tensor([[1],[2],[3]])   #列向量
print(b)
c = b.T                                  #转置为行向量
print(c)
print(a*b)
print(a*c)
输出:
tensor([[1],
        [2],
        [3]])
tensor([[1, 2, 3]])
tensor([[ 9,  3,  1],                  #按列向右广播的结果
        [ 6, 14,  6],
        [12, 24,  9]])
tensor([[ 9,  6,  3],              #按行向下广播的结果
        [ 3, 14,  9],
        [ 4, 16,  9]])

1.3 矩阵点乘

示例:
a = torch.randint(5,(2,2))
print(a)
print(a.mul(a))
输出:
tensor([[0, 1], [0, 3]])
tensor([[0, 1], [0, 9]])

二、叉乘

叉乘就是传统的矩阵乘法,可以通过torch.mm()和torch.matmul()实现。在神经网络模型中的符号为:
叉乘的模型简化符号

2.1 矩阵相乘

示例:
x = torch.ones(3,4)
y = torch.eye(4)          #对角线为1,其余元素为0
print(torch.mm(x,y))
输出:
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])

2.2 torch.matmul(含广播机制BroadCasting)

示例:
z = torch.ones(5,4,3)
print(torch.matmul(z,x))
输出:
tensor([[[3., 3., 3., 3.],
         [3., 3., 3., 3.],
         [3., 3., 3., 3.],
         [3., 3., 3., 3.]],

        [[3., 3., 3., 3.],
         [3., 3., 3., 3.],
         [3., 3., 3., 3.],
         [3., 3., 3., 3.]],

        [[3., 3., 3., 3.],
         [3., 3., 3., 3.],
         [3., 3., 3., 3.],
         [3., 3., 3., 3.]],

        [[3., 3., 3., 3.],
         [3., 3., 3., 3.],
         [3., 3., 3., 3.],
         [3., 3., 3., 3.]],

        [[3., 3., 3., 3.],
         [3., 3., 3., 3.],
         [3., 3., 3., 3.],
         [3., 3., 3., 3.]]])
  • 14
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值