深度实践OpenStack:基于Python的OpenStack组件开发—3.4 张量的科学计算
3.4 张量的科学计算
3.4.1 有理运算和广播语义
本节介绍张量的有理运算。在数学上,有理运算包括加、减、乘、除、有理数次乘方、有理数次开方这6种运算。在Python语法中,可以用英文加号“+”、英文连字符“-”、英文星号“*”、英文斜杠“/”分别表示加、减、乘、除四则运算,用两个英文星号“**”表示幂次运算,实现有理数次乘方和有理数次开方(即)。在PyTorch中,它们也可以对两个大小相同的张量逐元素做这类运算。代码清单3-12给出了两个大小相同的张量做初等运算的例子。
代码清单3-12 张量的初等运算
tl = torch.tensor([[1., 2., 3.], [4., 5., 6.]])
tr = torch.tensor([[7., 8., 9.], [10., 11., 12.]])
print(tl + tr) # 加法
print(tl - tr) # 减法
print(tl * tr) # 乘法
print(tl / tr) # 除法
print(tl ** tr) # 有理数次乘方
print(tl ** (1 / tr)) # 有理数次开方
在代码清单3-12的最后一行,用到了一个int型数据和张量的除法“1 / tr”。这里用到了“广播”(broadcast)这个语义(semantic)。广播语义可以解决一个数值和一个张量之间、两个大小不同的张量之间的运算。例如,代码清单3-13给出了一些利用广播语义完成有理运算的例子。
代码清单3-13 使用广播语义的有理运算的例子
print(torch.zeros(3, 4) + 5) # 得到各元素全为5的大小为(3,4)的张量
print(-6 * torch.ones(2)) # 得到各元素全为-6的大小为(2,)的张量
print(torch.ones(2, 3, 4) + torch.ones(4)) # 得到各元素全为2的大小为(2,3,4)的张量
值得一提的是,并不是任意两个张量都可以进行广播。两个张量之间要进行广播,它们的大小必须满足以下条件:
* 两个张量的维度必须都大于等于1;
* 从后往前比较两个张量的大小,各大小条目都需要相同,直到任意一个张量的大小没有条目了,或者条目元素为1。
例如,大小为 (2, 3, 4) 和大小为 (1, 1, 4) 的两个张量之间可以广播,大小为 (2, 3, 4) 和大小为 (2, 1, 4) 的两个张量之间可以广播,大小为 (2, 3, 4) 和大小为 (4,) 的两个张量之间可以广播。但是,大小为 (2, 3, 4) 和大小为 (2, 4) 的两个张量之间就不可以广播,因为从后往前看第2个条目一个是3,另一个是2,不相同。
torch.Tensor还提供了一些成员方法,使得逐元素做相同的初等运算更简单,具体如下。
* 成员方法reciprocal():求倒数,即1除以张量。
* 成员方法sqrt():开平方。
* 成员方法rsqrt():先开平方,再取倒数。
* 成员方法addcmul() 和成员方法addcdiv():计算,,其中是数值,是调用的张量中的元素,和是作为参数的张量的元素。
利用tensor.Tensor类成员实现有理运算的例子见代码清单3-14。
代码清单3-14 利用tensor.Tensor类成员方法实现有理运算
t234 = torch.arange(24).view(2, 3, 4)
print('倒数 = {}'.format(t234.reciprocal()))
print('开平方 = {}'.format(t234.sqrt()))
- 点赞
- 收藏
- 关注作者
评论(0)