示例一:可以进行相加的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
分析如下:
- 前提说明:torch.empty函数用来返回一个未初始化的tensor,其具体的解释说明参见下图:
- 首先定义了一个维度为(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(可传播的)”需满足以下两个条件:
- 每一个tensor至少有一个维度
- 当开始从维度上进行迭代(可以理解为遍历,因为要遍历每一个维度然后进行相应的计算)时,从最尾端的维度开始,在每一个被遍历到的维度上的大小必须满足要么相等、其中一个tensor的该维度大小为1或者其中一个tensor在该维度上的大小不存在
根据以上两个条件,我们回过去看“示例二:不可以进行相加的tensor”,tensor x和tensor z在维度2(最尾端维度)上具有相同的大小2,所以该维度上可以进行相加操作且不会报错,但是在维度1上tensor x的大小为3,维度1上tensor z的大小为2,所以解释器曝出了RuntimeError,如示例二中输出结果如下中所示。
本模块中的截图中的示例代码中也给出了相关的判断tensor是否是“broadcastable”的相关示例,可以仔细思考一下,手写python程序验证一下。