持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
1.环境及版本
这里用的是python3.10,pytorch1.12.1版本已经搭配的cuda11.6。案例以及代码展示都会在jupyter note中演示。也可以在Anaconda中启动相应环境的jupyter。
2.数据操作
这里我们可以使用arange创建一个行向量,其中包含了0到4的整数,注意一点就是这里是以0为起点,然后输出总共五个数字,所以就只输出到4.然后我们可以将这组元素以我们想要的形式进行重置,比如使用torch.ones(几行,几列)的形式将所有元素置为1,或者使用torch.zeros(几行,几列)的形式将所有元素置为0.这三种为常用基本操作。
3.运算符
对于任意具有相同形状的张量, 常见的标准算术运算符加减乘除的操作都可以被升级为按元素运算。其中需注意一点,在out[22]和out[23]可以发现当操作的两个张量之中如果有任意张量的其中一个元素是浮点型,那么输出的所有元素都按照浮点型进行输出。
同时我们也可以将两个张量连结到一起如in[28]我们设置了两个方式不同但是格式相同的张量X,Y。可以发现,在out[28]中输出张量的轴1长度(10)是两个输入张量轴1长度的总和(5+5)。第二个输出张量的轴0长度(2)是两个输入张量轴0长度的总和(1+1)。
4.广播机制
在上面的操作中可以看到在相同形状的两个张量上可以按照元素进行执行。当两个张量的形状不同的时候我们仍然可以通过广播机制来执行按元素操作。
设置的两个不同形状的张量,a是三行一列,b是一行两列,c是两行两列,可以看出a+b,b+c可以正常显示结果,而a+c却不能,这里的主要原因虽然可以不同形状的张量可以进行操作,但还是会有一定的限制,需要运行前进行检查和匹配。
5.索引和切片
跟数组一样,张量中的元素也可以通过索引进行访问。通常都将第一个元素的索引定为0,最后一个为-1.
设置一个四行十列的张量,对其进行索引1号位置的向量和进行两个片段的选取,依然是遵循左闭右开的原则。
可以看出这里的索引跟python中的索引和切片操作类似,只不过一个是数字一个是向量。
6.转换为其他的python对象
将深度学习框架定义的张量转换为NumPy张量很容易,反之也同样容易。torch张量和numpy数组将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。
在in[41]中我们先定义一个numpy数组A,然后再将其放入torch的定义中,输出的就是torch的张量。同时也可以通过item函数或者python的内置函数将其转换成python标量。
7.总结
到了这里我们更多操作的不再是数字而是向量,但是它的操作与数字的操作极其相似。两者有很多贯通之处。