首页 > 代码库 > torch学习笔记3--tensor介绍1,对tensor的基本认知

torch学习笔记3--tensor介绍1,对tensor的基本认知

tensor是torch的核心,理论上四大框架如果不考虑直接汇编,使用更底层的语言,那么运算的速度和结果都应该是一样的。

caffe有blob数据块减小数据读取时候造成的时间损失,而tensor也是一样。(本人只了解过caffe、torch,其它两款没碰过)

tensor像是numpy的升级版,对速度十分重视的深度学习(等价于神经网络模型)来说,对数据读取,运算速度都严格要求。

 --- 创建思维的tensor 4x5x6x2
 z = torch.Tensor(4,5,6,2)
 --- 更多的维数需求也可以通过下面的方式实现,下面是6维的例子:
 s = torch.LongStorage(6)
 s[1] = 4; s[2] = 5; s[3] = 6; s[4] = 2; s[5] = 7; s[6] = 3;
 x = torch.Tensor(s)

  而nDimension()可以得到维数大小,size()可以得到每个维的数量大小。LongStorage数据则会显示数据的长度。

> x:nDimension()
6
> x:size()
 4
 5
 6
 2
 7
 3
[torch.LongStorage of size 6]

  事实上Tensor数据是保存在Storage中,所以也能够通过storage()函数获取tensor数据中的值。但存储的方式和读取的方式不同。

       对于三维的tensor数据来说

x:storage()[x:storageOffset()
              +(3-1)*x:stride(1)+(4-1)*x:stride(2)+(5-1)*x:stride(3)]

等价于

x[3][4][5]

  tensor数据写入的方式也能写成:

x = torch.Tensor(4,5)
s = x:storage()
for i=1,s:size() do -- 填充storge
  s[i] = i
end
> x -- x被认为是2维矩阵
  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]

  一行的数据元素是连续存储的。

x = torch.Tensor(4,5)
i = 0

x:apply(function()
  i = i + 1
  return i
end)

> x
  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]

> x:stride()
 5
 1  -- 在最后维之中的元素是连续的
[torch.LongStorage of size 2]

  tensor之中数据元素的类别有(分别能在c对应):

ByteTensor -- 无符号字符串
CharTensor -- 有符号字符串
ShortTensor -- short
IntTensor -- ints
LongTensor -- longs
FloatTensor -- floats
DoubleTensor -- doubles

  多数操作都只支持浮点类型数据

由于tensor已经使用了优化过的函数,所以多用已有函数进行操作。

甚至如果你想要复制一个数,也尽量使用函数。

y = torch.Tensor(x:size()):copy(x)

或者

y = x:clone()

  

  

torch学习笔记3--tensor介绍1,对tensor的基本认知