torch Tensor学习:切片操作

torch
Tensor
Slice

一直使用的是matlab处理矩阵,想从matlab转到lua+torch上,然而在matrix处理上遇到了好多类型不匹配问题。所以这里主要总结一下torch/Tensor中切片操作方法以及其参数类型,以备查询。

已知有矩阵M

M=torch.range(1,20):resize(4,5)
th> M
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
[torch.DoubleTensor of size 4x5]

这里需要注意的是 resize() 和reshape()的区别, M:reshape(5,4)并不改变M,但是M:resize(5,4)改变M的size

  1. 选取M的第2,3列
N1=M:narrow(2,2,2)
-- [self] narrow (dim,index,size) --> dim表示待选取的维度,index 是待选取连续列的起始数值, size是选取的列数,那么总体就是在第二维上从第2列选取连续的2列 N2=M:sub(1,-1,2,3)
-- [Tensor] sub(dim1s,dim1e ...[,dim4s [,dim4e]])
--dim1s,dim1e 分别对应第一维上的起始index和终止index,-1表示该维度倒数第一个...以此类推 N3=M[{{},{2,3}}]

另外

[Tensor] select(dim,index) :在第dim维选取第index"行",这只能取一个切片

需要注意的几点:

A. sub, narrow, select, [] 函数都是在原始的数据上进行操作的,也就是说获得的Tensor都仅仅是一个视图而已,改变其中一个另一个也会变化

B. 因为A的原因,这几个函数执行的速度非常快(对于这点深有体会,torch中Tensor操作速度蛮快的,但是涉及到内存分配,速度有点慢)

C. sub,narrow,select 都是选取Tensor一块数据,而不能选取特定的值,比如一次性选取上述矩阵M的第1行第2列,第2行第4列 和第4行第1列的值

C. [Tensor][{dim1,dim2}] or [{{dim1s,dim1e},{dim2s,dim2e}}] 的输入量还可以是ByteTensor类型,由0,1元素组成的掩码矩阵,比如

M[torch.lt(M,8)] =0   --令M中小于8的元素为0
th> M
0 0 0 0 0
0 0 8 9 10
11 12 13 14 15
16 17 18 19 20
[torch.DoubleTensor of size 4x5]

注: 逻辑操作:lt, gt, le, eq, ge,ne返回的都是ByteTensor类型的掩码Tensor

  1. 针对于上边提到的注意点C,如果想选取第dim维上的某几个不连续的“行”

    例如 选取M的第2,5,3,1列构成新的矩阵
N1=M:index(2,torch.LongTensor({2,5,3,1}))
-- [Tensor] index(dim,indices) 在矩阵M中选取dim维上索引indices中对应的"行",indices的类型要求为LongTensor
-- 返回Tensor的number of dimensions 和原始Tensor相同,返回的是新分配的内存

注: [] 操作是一系列narrow,select,sub的组合,其并不涉及新内存,而index则涉及到新内存的分配

index的相关函数

a. indexCopy

-- [Tensor] indexCopy(dim,indices,tensor) -- 将tensor中的元素拷贝到原tensor对应indices上去,tensor和带存储的大小应该严格一致
N=torch.Tensor(4,2):fill(-1)
M:indexCopy(2,torch.LongTensor{4,1},N) -- 这个返回的是N,但M变化了
th> M
-1 2 3 -1 5
-1 7 8 -1 10
-1 12 13 -1 15
-1 17 18 -1 20
[torch.DoubleTensor of size 4x5]

b. indexAdd

-- [Tensor] indexAdd(dim,indices,tensor) 和indexCopy类似,只是在原tensor的indices对应的位置加上tensor
M:indexAdd(2,torch.LongTensor{1,3},-N) --返回的是-N
th> M
0 2 4 -1 5
0 7 9 -1 10
0 12 14 -1 15
0 17 19 -1 20
[torch.DoubleTensor of size 4x5]

c. indexFill

[Tensor] indexFill(dim, indices,var) -- 和indexCopy相同,只是使用var去填充indices对应的元素,在原Tensor内存上改变

总结:

A. index相关的函数中只有index是重新开辟的内存,而indexCopy,indexFill,indexAdd均是在原内存上操作

B. index相关函数仅仅能在某一个特定维度dim上,相对自由的选取indices,而不能同时操作多个维度

C. index相关函数中 indices参数的类型为LongTensor!!!尤其要注意

  1. tensor中元素的自由选取和赋值

    a. gather

    [Tensor] gather (dim,indices) -- 首先这个函数需要重新分配内存

    。-- 该函数的功能主要是沿着dim维度,在每一个row上按照indices选取数值,indices为LongTensor类型

    看下面官方文档的图示更好理解

1486728865883.jpg

左图是: result=src:gatter(1,index), index=torch.LongTensor({{1,2,3},{2,3,1}})

其输出result的大小和index相同,result[{1,{}}]为src每一列上的index[{{1},{}}]对应的元素,为什么是列呢,因为dim=1,决定了沿着row数,也就是列了。 后面的类似

注意:因为dim=1,所以index的第二维长度应该和src的dim=2长度相同

b. scatter

[Tensor] scatter(dim,indices,src|var)

这个函数和gatter是一组的,gather是取元素,scatter是元素赋值,其indices查找方式相同。待赋值可以使Tensor src也可以是标量var

同样有新的内存分配发生

c. maskedSelect

[Tensor] maskedSelect(mask)

。-- mask 是ByteTensor类型的掩码矩阵或者向量,元素为0或1. mask并不要求size和src相同,但元素个数必须相同。

。--返回的是mask中元素1对应的src中元素,长度和mask中1的个数相同,元素类型和src类型相同,ndim=1

d. maskedCopy

[Tensor] maskedCopy(mask,tensor)

。--和maskedSelect的关系,就和index与indexCopy的关系,对掩码确定的元素进行赋值

e. maskedFill

[Tensor] maskedFill(mask,val)

。 --类比index和indexFill

  1. 总结

    A: mask都是ByteTensor类型,indices都是LongTensor类型

    B: view操作的有 narrow, sub,select 和 [ ]

    C: 重新分配内存的有 index,gatter,maskedSelect

    D: 不牵涉到内存的重新分配能够大大提升程序的效率

torch Tensor学习:切片操作的更多相关文章

  1. [深度学习] Pytorch学习(一)—— torch tensor

    [深度学习] Pytorch学习(一)-- torch tensor 学习笔记 . 记录 分享 . 学习的代码环境:python3.6 torch1.3 vscode+jupyter扩展 #%% im ...

  2. 深度学习框架Tensor张量的操作使用

    - 重点掌握基本张量使用及与numpy的区别 - 掌握张量维度操作(拼接.维度扩展.压缩.转置.重复……) numpy基本操作: numpy学习4:NumPy基本操作 NumPy 教程 1. Tens ...

  3. python学习之“切片操作从入门到精通”

    在python学习开发的过程中,我们总是不断的要对List(列表),Tuple(元组)有取值操作:假如我们有一个列表List1现在想取出1其中的前5个元素,改怎么操作呢? >>> L ...

  4. torch.Tensor文档学习笔记

    A torch.Tensor is a multi-dimensional matrix containing elements of a single data type. 张量(torch.Ten ...

  5. PyTorch官方中文文档:torch.Tensor

    torch.Tensor torch.Tensor是一种包含单一数据类型元素的多维矩阵. Torch定义了七种CPU tensor类型和八种GPU tensor类型: Data tyoe CPU te ...

  6. torch 深度学习(3)

    torch 深度学习(3) 损失函数,模型训练 前面我们已经完成对数据的预处理和模型的构建,那么接下来为了训练模型应该定义模型的损失函数,然后使用BP算法对模型参数进行调整 损失函数 Criterio ...

  7. 4-python学习——数据操作

    4-python学习--数据操作 参考python类型转换.数值操作(收藏) Python基本运算符 数据类型转换: 有时候,可能需要执行的内置类型之间的转换.类型之间的转换,只需使用类名作为函数. ...

  8. 关于javascript里面仿python切片操作数组的使用方法

    其实在使用了好一段时间的 python之后,我觉得最让我念念不忘的并不是python每次在写函数或者循环的时候可以少用{}括号这样的东西(ps:其实也是了..感觉很清爽,而且又开始写js的时候老是想用 ...

  9. torch 深度学习(5)

    torch 深度学习(5) mnist torch siamese deep-learning 这篇文章主要是想使用torch学习并理解如何构建siamese network. siamese net ...

随机推荐

  1. SpringMVC-SimpleDEMO

    本博文主要将如何配置一个简单的SpringMVC的DEMO,由上一讲的SpringMVC工作流程来看,配置一个SpringMVC的步骤是简单而清晰的. 一.引入SpringMVC所需依赖   < ...

  2. 怎么将linux下的项目转换成windows的VS2010下的项目?

    怎么将linux下的项目转换成windows的VS2010下的项目?             不显示删除回复             显示所有回复             显示星级回复        ...

  3. 取MAC地址 (含多网卡),最好的方法,支持Vista,Win7

    取MAC地址 (含多网卡),最好的方法,支持Vista,Win7 unit Unit1; interface usesWindows, Messages, SysUtils, Variants, Cl ...

  4. SVN遇到的问题和解决方法(后期还会继续更新)

    1,smartsvn客户端(version客户端类似),一些.a文件无法识别,也就无法提交到svn! 解决办法如下: 在smartsvn客户端下面view->Ignored Files 勾选上就 ...

  5. dubbo总结

     一 .Dubbo产生背景 单一应用架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键. 垂直应用架构当访 ...

  6. 【Android】ListView、RecyclerView异步加载图片引起错位问题

    今天在RecyclerView列表里遇到一个情况,它包含300条数据,每项包含一个图片,发现在首次载入时,由于本地没图,请求网络的时候:快速滑动导致了图片错位.闪烁的问题. 原理的话有一篇已经说的很清 ...

  7. Linux中Qt的安装

    1.下载Ot安装包 Qt5.30的下载地址如下,在网页中打开找到需要的资源,下载.run格式的安装软件. http://download.qt.io/archive/qt/5.3/5.3.0/qt-o ...

  8. C++中去掉string字符串中的\r\n等

    string imagedata;imagedata = “dudau\r\ndadafca\r\n” CString Image; Image = imagedata.c_str(); Image. ...

  9. 照着官网来安装openstack pike之创建并启动instance

    有了之前组件(keystone.glance.nova.neutron)的安装后,那么就可以在命令行创建并启动instance了 照着官网来安装openstack pike之environment设置 ...

  10. 20145216史婧瑶《Java程序设计》第5周学习总结

    20145216 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 异常处理 8.1 语法与继承架构 Java中所有错误都会被打包为对象,运用try.catch,可以在错误发生 ...