前言

PyTorch 中的数据类型为 Tensor,Tensor 与 Numpy 中的 ndarray 类似,同样可以用于标量,向量,矩阵乃至更高维度上面的计算。PyTorch 中的 tensor 又包括 CPU 上的数据类型和 GPU 上的数据类型,一般 GPU 上的 Tensor 是 CPU 上的 Tensor 加 cuda() 函数得到。通过使用 Type 函数可以查看变量类型。系统默认的 torch.Tensor 是 torch.FloatTensor 类型。例如 data = torch.Tensor(2,3) 是一个 2*3 的张量,类型为 FloatTensor; data.cuda() 就将其转换为 GPU 的张量类型,torch.cuda.FloatTensor 类型。


① 基本类型

如图所示,下面是 cpu 和 gpu 版本的张量(Tensor)的基本类型,一共是 8 种。

PyTorch变量类型(cpu/gpu) - 图1

  • torch.FloatTensor(2, 2) 构建一个 2*2 Float类型的张量
    PyTorch变量类型(cpu/gpu) - 图2
  • torch.DoubleTensor(2, 2) 构建一个 2*2 Double类型的张量
  • torch.ByteTensor(2, 2) 构建一个 2*2 Byte类型的张量
  • torch.CharTensor(2, 2) 构建一个 2*2 Char类型的张量
  • torch.ShortTensor(2, 2) 构建一个 2*2 Short类型的张量
  • torch.IntTensor(2, 2) 构建一个 2*2 Int类型的张量
  • torch.LongTensor(2, 2) 构建一个 2*2 Long类型的张量

官网还介绍了从 python 的基本数据类型 list 和科学计算库 numpy.ndarray 转换为 Tensor 的例子:

  1. >>> torch.tensor([[1., -1.], [1., -1.]])
  2. tensor([[ 1.0000, -1.0000],
  3. [ 1.0000, -1.0000]])
  4. >>> torch.tensor(np.array([[1, 2, 3], [4, 5, 6]]))
  5. tensor([[ 1, 2, 3],
  6. [ 4, 5, 6]])

② 张量类型之间的转换

2.1 CPU 和 GPU 的 Tensor 之间转换

从 cpu –> gpu,使用data.cuda()即可。
若从 gpu –> cpu,则使用data.cpu()

2.2 Tensor 与 Numpy Array 之间的转换

Tensor –> Numpy.ndarray 可以使用 data.numpy(),其中 data 的类型为torch.Tensor
Numpy.ndarray –> Tensor 可以使用torch.from_numpy(data),其中 data 的类型为numpy.ndarray

2.3 Tensor 的基本类型转换(也就是 float 转 double,转 byte 这种。)

为了方便测试,我们构建一个新的张量,你要转变成不同的类型只需要根据自己的需求选择即可

  • tensor = torch.Tensor(2, 5)
  • torch.long() 将 tensor 投射为long类型
    newtensor = tensor.long()
  • torch.half() 将 tensor 投射为半精度浮点 (16 位浮点)类型
    newtensor = tensor.half()
  • torch.int() 将该 tensor 投射为int类型
    newtensor = tensor.int()
  • torch.double() 将该 tensor 投射为double类型
    newtensor = tensor.double()
  • torch.float() 将该 tensor 投射为float类型
    newtensor = tensor.float()
  • torch.char() 将该 tensor 投射为char类型
    newtensor = tensor.char()
  • torch.byte() 将该 tensor 投射为byte类型
    newtensor = tensor.byte()
  • torch.short() 将该 tensor 投射为short类型
    newtensor = tensor.short()

思考

据我目前使用来看,最常用的还是 Tensor.byte(), Tensor.float()。因为 pytorch 底层很多计算的逻辑默认需要的是这些类型。但是如果当你需要提高精度,比如说想把模型从 float 变为 double。那么可以将要训练的模型设置为model = model.double()。此外,还要对所有的张量进行设置:pytorch.set_default_tensor_type('torch.DoubleTensor'),不过 double 比 float 要慢很多,要结合实际情况进行思考。


参考资料

[1] pytorch 张量 torch.Tensor 类型的构建与相互转换以及 torch.type() 和 torch.type_as() 的用法
[2] PyTorch torch.Tensor 教程
https://blog.csdn.net/g11d111/article/details/80896137