通过torch.empty来看pytorch的broadcast机制

示例一:可以进行相加的tensor

from __future__ import print_function
import torch # 找不到torch模块是因为对应的解释器中没有torch模块
# File-Settings-grammer_learning-Project Interpreter:进行更换即可


x=torch.empty((6,1,2))
z=torch.empty((1,2,2))
c=x+z
print(c)
print(x)
y=torch.empty(2,3)
print(y)

输出结果如下:

D:\Anaconda3\envs\pytorch_1.4_python_3.6_CUDA_10.1\python.exe E:/【Developer】/python/deeplearning_programs/grammar_learning/test/env_validate.py
tensor([[[ 0.0000e+00,  0.0000e+00],
         [ 0.0000e+00,  0.0000e+00]],

        [[ 0.0000e+00,  0.0000e+00],
         [ 0.0000e+00,  0.0000e+00]],

        [[ 0.0000e+00,  0.0000e+00],
         [ 0.0000e+00,  0.0000e+00]],

        [[-1.5004e-16,  4.5915e-41],
         [-1.5004e-16,  4.5915e-41]],

        [[-1.5034e-16,  4.5915e-41],
         [-1.5034e-16,  4.5915e-41]],

        [[ 2.4263e-29,  4.5262e-43],
         [ 2.4263e-29,  4.5262e-43]]])
tensor([[[ 0.0000e+00,  0.0000e+00]],

        [[ 0.0000e+00,  0.0000e+00]],

        [[ 0.0000e+00,  0.0000e+00]],

        [[-1.5004e-16,  4.5915e-41]],

        [[-1.5034e-16,  4.5915e-41]],

        [[ 2.4263e-29,  4.5262e-43]]])
tensor([[4.3697e-29, 4.5262e-43, 1.7796e-43],
        [0.0000e+00, 0.0000e+00, 0.0000e+00]])

Process finished with exit code 0

分析如下:

  1. 前提说明:torch.empty函数用来返回一个未初始化的tensor,其具体的解释说明参见下图:
    在这里插入图片描述
  2. 首先定义了一个维度为(6,1,2)的变量x,然后定义了一个维度为(1,2,2)的变量z,然后进行相加得到并且输出c,如上所示:在命令行中输出说明程序可正常运行

示例二:不可以进行相加的tensor

还是上面的程序,但是将x的维度进行相应的更改,改成(6,3,2),程序如下:

from __future__ import print_function
import torch # 找不到torch模块是因为对应的解释器中没有torch模块
# File-Settings-grammer_learning-Project Interpreter:进行更换即可


x=torch.empty((6,3,2))
z=torch.empty((1,2,2))
c=x+z
print(c)
print(x)
y=torch.empty(2,3)
print(y)

输出结果如下:

D:\Anaconda3\envs\pytorch_1.4_python_3.6_CUDA_10.1\python.exe E:/【Developer】/python/deeplearning_programs/grammar_learning/test/env_validate.py
Traceback (most recent call last):
  File "E:/【Developer】/python/deeplearning_programs/grammar_learning/test/env_validate.py", line 8, in <module>
    c=x+z
RuntimeError: The size of tensor a (3) must match the size of tensor b (2) at non-singleton dimension 1

Process finished with exit code 1

如上所示:解释器告诉我们,tensor x在维度1上的值3和tensor z在维度1上的值不匹配,报了一个RuntimeError。为什么呢,主要是torch的broadcasting机制的原因,详见原因分析。

原因分析

示例二中不能进行tensor x和z进行相加的原因是torch的broadcast机制不允许其进行操作,具体原因可以查看官网 Broadcasting Semantics,以下是我的截图:
在这里插入图片描述
如图所示,如何判定一个tensor是否是“broadcastable(可传播的)”需满足以下两个条件:

  1. 每一个tensor至少有一个维度
  2. 当开始从维度上进行迭代(可以理解为遍历,因为要遍历每一个维度然后进行相应的计算)时,从最尾端的维度开始,在每一个被遍历到的维度上的大小必须满足要么相等、其中一个tensor的该维度大小为1或者其中一个tensor在该维度上的大小不存在

根据以上两个条件,我们回过去看“示例二:不可以进行相加的tensor”,tensor x和tensor z在维度2(最尾端维度)上具有相同的大小2,所以该维度上可以进行相加操作且不会报错,但是在维度1上tensor x的大小为3,维度1上tensor z的大小为2,所以解释器曝出了RuntimeError,如示例二中输出结果如下中所示。
本模块中的截图中的示例代码中也给出了相关的判断tensor是否是“broadcastable”的相关示例,可以仔细思考一下,手写python程序验证一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值