lzx1413's blog

torch7 Tensor 文档学习笔记

Tensor类可能是Torch中最重要的类,几乎所有的模块都依赖它。和Torch7中的其他类类似,这个类也可以进行序列化。

多维矩阵

一个Tensor 是一个多维矩阵,通过借助使用LongStorage可以创建无限维度的矩阵。

例如

1
2
3
4
5
6
--creation of a 4D tensor 4x5x6x2
z = torch.Tensor(4,5,6,2)
--for more dimensions,(here a 6D tensor)
s = torch.LongStorage(6)
s[1] = 4;s[2]= 5;s[3] = 5;s[4] = 2;s[5] = 7;s[6] = 3;
x = torch.Tensor(s)

x:nDimension()可以获得维度数目 x:size()可以获得各维度的大小

如果我们有一个三维矩阵x = Tensor(7,7,7),那么可以通过x[2][3][4]来获得(2,3,4)位置上的元素

Tensor 中的数字是行向量连续的

数据类型

1
2
3
4
5
6
7
8
torch.setdefaulttensortype('torch.FloatTensor')
ByteTensor -- contains unsigned chars
CharTensor -- contains signed chars
ShortTensor -- contains shorts
IntTensor -- contains ints
LongTensor -- contains longs
FloatTensor -- contains floats
DoubleTensor -- contains doubles

高效内存管理

Tensor的所有操作都不会进行数据拷贝,如果需要进行拷贝时,通过

1
2
y = torch.Tensor(x:size()):copy(x)
y = x:clone()

构造Tensor

默认条件下,申请的内存不会被初始化,构造新Tensor的方法有一下几种:

  • torch.Tensor()返回空的tensor

  • troch.Tensor(tensor) 返回引用 tensor,没有内存拷贝

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    x = torch.Tensor(2,5):fill(3.14)
    > x
    3.1400 3.1400 3.1400 3.1400 3.1400
    3.1400 3.1400 3.1400 3.1400 3.1400
    [torch.DoubleTensor of dimension 2x5]
    y = torch.Tensor(x)
    > y
    3.1400 3.1400 3.1400 3.1400 3.1400
    3.1400 3.1400 3.1400 3.1400 3.1400
    [torch.DoubleTensor of dimension 2x5]
    y:zero()
    > x -- elements of x are the same as y!
    0 0 0 0 0
    0 0 0 0 0
    [torch.DoubleTensor of dimension 2x5]
  • torch.Tensor(sz1,[,sz2[,sz3[,sz4]]])

  • torch.Tensor(table)

    1
    2
    3
    4
    > torch.Tensor({{1,2,3,4}, {5,6,7,8}})
    1 2 3 4
    5 6 7 8
    [torch.DoubleTensor of dimension 2x4]

函数接口

1
2
3
4
5
6
7
8
9
10
11
12
> torch.DoubleTensor(4):fill(3.14)
3.1400
3.1400
3.1400
3.1400
[torch.DoubleTensor of dimension 4]
> torch.Tensor(4):zero()
0
0
0
0
[torch.DoubleTensor of dimension 4]

resize

按照行向量连续分布,如果resize后的大小大于原来的矩阵,则剩余的填充0,如果小于原来的矩阵,则截取连续数据中的前面的合适的长度来形成新的矩阵,注意,此处也是默认引用,会同时改变原来的数据分布。

切片

narrow(dim,index,size)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
x = torch.Tensor(5, 6):zero()
> x
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
[torch.DoubleTensor of dimension 5x6]
y = x:narrow(1, 2, 3) -- narrow dimension 1 from index 2 to index 2+3-1
y:fill(1) -- fill with 1
> y
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
[torch.DoubleTensor of dimension 3x6]
> x -- memory in x has been modified!
0 0 0 0 0 0
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
0 0 0 0 0 0
[torch.DoubleTensor of dimension 5x6]
  • sub(dim1s, dim1e … [, dim4s [, dim4e]])

  • select(dim, index)

  • 使用[{},{}]来进行切片

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    x = torch.Tensor(5, 6):zero()
    > x
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    [torch.DoubleTensor of dimension 5x6]
    x[{ 1,3 }] = 1 -- sets element at (i=1,j=3) to 1
    > x
    0 0 1 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    [torch.DoubleTensor of dimension 5x6]
    x[{ 2,{2,4} }] = 2 -- sets a slice of 3 elements to 2
    > x
    0 0 1 0 0 0
    0 2 2 2 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    [torch.DoubleTensor of dimension 5x6]
    x[{ {},4 }] = -1 -- sets the full 4th column to -1
    > x
    0 0 1 -1 0 0
    0 2 2 -1 0 0
    0 0 0 -1 0 0
    0 0 0 -1 0 0
    0 0 0 -1 0 0
    [torch.DoubleTensor of dimension 5x6]

mask

maskedSelect(mask) maskedCopy(mask) maskedFill(mask,val)

Expanding/Replicating/Squeezing Tensors

  • [result]expand([result],size)

    这种方式不会创建新的tensor,而只是改变了对原有数据的查看方法,所以对新数据的操作会影响原来的数据

  • [Tensor]repeatTensor([result],sizes)

    这种方式会创建新的数据,sizes用来指定 每个维度的重复次数

tensor view

下面的方法会返回一个tensor,这个tensor是原来数据的另外一个查看方法。

  • [result] view([result,]tensor,sizes)
  • [result] viewAs([result,],tensor,template)
  • [Tensor] transpose(dim1,dim2)交换两个维度,2D中可以使用t()进行转制。
  • [Tensor] permute(dim1,dim2,...,dimn) 全部自定义的维度转换
  • [Tensor] unfold(dim,size,step)