Tensor
Tensor
类可以说是Torch中最重要的类了,因为几乎所有的包都依赖于这个类实现.它是整个Torch实现的数据基础.
类型
Tensor由以下几种类型:
ByteTensor -- 代表 unsigned char
CharTensor -- 代表 signed char
ShortTensor -- 代表 short
IntTensor -- 代表 int
FloatTensor --代表 float
DoubleTensor -- 代表 double
大多数数学操作都仅仅是为FloatTensor
和 DoubleTensor
实现的.但是,为了优化内存的话,其他类型就会用到了.
为了方便,我们一般使用torch.Tensor
来定义数据,因为它是独立于数据类型的.而要改变默认数据类型可以使用下面的函数:
torch.setdefaulttensortype("torch.FloatTensor")
多维矩阵
Tensor
实际上就是一个多维矩阵,我们可以使用toch.Tensor
或者storage
来定义.
例子:
z = torch.Tensor(4, 5, 6, 2)
s = torch.longStorage(3)
s[1] = 2; s[2] = 3; s[3] = 5
x = torch.Tensor(s)
可以通过dim()
或者nDimension()
访问Tensor
的维度数.size(i)
可以返回第i
维的大小.而size()
会返回所有维的大小.
>x:dim()
3
>x:size()
2
3
5
>x:size(2)
3
数据的内部表示
其实,Tensor
的数据是包含在一个Storage
里的,可以使用storage()
进入。也就是说,Tensor
可以看做Storage
的一种视角:Storage
只是表示一块内存,Tensor
将它分出了维度。
x = torch.Tensor(4,5)
s = x:storage()
for i=1,s:size() do -- fill up the Storage
s[i] = i
end
> x -- s is interpreted by x as a 2D matrix
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
[torch.DoubleTensor of dimension 4x5]
注意在Torch7中,一行的数据是连续的,这有点类似C中的数组。
内存管理
所有的Tensor
的操作都没有进行内存复制,所有的方法都是变换已经存在的Tensor
,或者返回一个新的Tensor
引用相同的Storage
。
x = torch.Tensor(5):zero()
> x
0
0
0
0
0
[torch.DoubleTensor of dimension 5]
> x:narrow(1, 2, 3):fill(1) -- narrow() returns a Tensor
-- referencing the same Storage as x
> x
0
1
1
1
0
[torch.Tensor of dimension 5]
如果真的想复制Tensor
,可以使用copy()
:
y = torch.Tensor(x:size()):copy(x)
或者使用clone()
:
y = x:clone()
常用函数
Tensor 的构造函数
构造函数,将构造新的Tensor
。分配的内存并没有初始化,所以里面的数是随机的。
torch.Tensor() --返回空的tensor
torch.Tensor(tensor) --返回新的tensor,引用的是给定tensor的内存
torch.Tensor(sz1 [,sz2 [,sz3 [,sz4]]]]) --