Pytorch 中的 5 个非常有用的张量操作
作者:Samyukta Nair,编译:ronghuaiyang
导读
虽然也有其他方式可以实现相同的效果,但是这几个操作可以让使用更加方便。
PyTorch是一个基于Python的科学包,用于使用一种称为张量的特殊数据类型执行高级操作。张量是具有规则形状和相同数据类型的数字、向量、矩阵或多维数组。PyTorch是NumPy包的另一种选择,它可以在GPU下使用。它也被用作进行深度学习研究的框架。
这5个操作是:
- expand()
- permute()
- tolist()
- narrow()
- where()
1. expand()
将现有张量沿着值为1的维度扩展到新的维度。张量可以同时沿着任意一维或多维展开。如果你不想沿着一个特定的维度展开张量,你可以设置它的参数值为-1。
注意:只能扩展单个维度
# Example 1 - working
a=torch.tensor([[[1,2,3],[4,5,6]]])
a.size()
>>torch.Size([1, 2, 3])
a.expand(2,2,3)
>>tensor([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]])
在这个例子中,张量的原始维数是[1,2,3]。它被扩展到[2,2,3]。
2. permute()
这个函数返回一个张量的视图,原始张量的维数根据我们的选择而改变。例如,如果原来的维数是[1,2,3],我们可以将它改为[3,2,1]。该函数以所需的维数顺序作为参数。
# Example 1 - working
a=torch.tensor([[[1,2,3],[4,5,6]]])
a.size()
>>torch.Size([1, 2, 3])
a.permute(2,1,0).size()
>>torch.Size([3, 2, 1])
a.permute(2,1,0)
>>tensor([[[1],
[4]],
[[2],
[5]],
[[3],
[6]]])
在这个例子中,原始张量的维度是[1,2,3]。使用permuting,我将顺序设置为(2,1,0),这意味着新的维度应该是[3,2,1]。如图所示,张量的新视图重新排列了数字,使得张量的维度为[3,2,1]。
当我们想要对不同维数的张量进行重新排序,或者用不同阶数的矩阵进行矩阵乘法时,可以使用这个函数。
3. tolist()
这个函数以Python数字、列表或嵌套列表的形式返回张量。在此之后,我们可以对它执行任何python逻辑和操作。
# Example 1 - working
a=torch.tensor([[1,2,3],[4,5,6]])
a.tolist()
>> [[1, 2, 3], [4, 5, 6]]
在这个例子中,张量以嵌套列表的形式返回。
4. narrow()
这个函数返回一个新的张量,这个张量是原来张量的缩小版。这个函数的参数是输入张量、要缩小的维数、起始索引和新张量沿该维数的长度。它返回从索引start到索引(start+length-1)中的元素。
# Example 1 - working
a=torch.tensor([[1,2,3,4],[5,6,7,8],[9,10,11,12],[14,15,16,17]])
torch.narrow(a,1,2,2)
>> tensor([[ 3, 4],
[ 7, 8],
[11, 12],
[16, 17]])
在这个例子中,张量要沿着第2维,也就是最里面的维度缩小。它接受列表中的元素,从索引2开始,到索引3(=2+2 -1,即start+length-1)。
Narrow()的工作原理类似于高级索引。例如,在一个2D张量中,使用[:,0:5]选择列0到5中的所有行。同样的,可以使用torch.narrow(1,0,5)。然而,在高维张量中,对于每个维度都使用range操作是很麻烦的。使用narrow()可以更快更方便地实现这一点。
5. where()
这个函数返回一个新的张量,其值在每个索引处都根据给定条件改变。这个函数的参数有:条件,第一个张量和第二个张量。在每个张量的值上检查条件(在条件中使用),如果为真,就用第一个张量中相同位置的值代替,如果为假,就用第二个张量中相同位置的值代替。
# Example 1 - working
a=torch.tensor([[[1,2,3],[4,5,6]]]).to(torch.float32)
b=torch.zeros(1,2,3)
torch.where(a%2==0,b,a)
>>tensor([[[1., 0., 3.],
[0., 5., 0.]]])
这里,它检查张量a的值是否是偶数。如果是,则用张量b中的值替换,b中的值都是0,否则还是和原来一样。
此函数可用于设定阈值。如果张量中的值大于或小于某一数值,它们可以很容易地被替换。
- EOF -
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python装饰器
- 3分钟短文:十年窖藏,Laravel告诉你表单验证的“正确姿势”
- 面试官:说说SpringBoot中Spring容器的启动过程
- Python IO
- Python解析式
- 面试官:Tomcat 的调优怎么做?你的最佳实践有哪些?
- Tomcat源码分析
- lazy-mock ,一个生成后端模拟数据的懒人工具
- Python拉链法和开地址法实现字典
- Springboot2 整合redis发布订阅 解决订阅多个频道重复代码过多 创建很多bean问题
- 爬虫选择器算法漫谈
- Java 类加载机制及双亲委派模型
- Python函数
- Effective C++条款3 我可以不使用const?
- t想成为微信斗图之王么?你需要这款开源工具的力量!