《神经网络与PyTorch实战》——3.4 张量的科学计算

举报
华章计算机 发表于 2019/06/05 20:05:06 2019/06/05
【摘要】 本书摘自《神经网络与PyTorch实战》——书中第3章,第3.4.1节,作者是肖智清。

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()))


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。