Deep Learning with Pytorch-学习笔记(一)

张量:

1.张量是PyTorch中基本的数据结构。张量是一个数组,即一种存储数字集合的数据结构,这些数字可通过索引单独访问,也可通过多个索引进行索引。

2.张量与list的区别

   Python列表或数字元组(tuple)是在内存中单独分配的Python对象的集合;

   PyTorch张量或NumPy数组(通常)是连续内存块上的视图(view),这些内存块存有未封装(unboxed)的C数值类型。

3.张量与存储

      数值分配在连续的内存块中,由torch.Storage实例管理。存储(Storage)是一个一维的数值数据数组,例如一块包含了指定类型(可能是float或int32)数字的连续内存块。

    PyTorch的张量(Tensor)就是这种存储(Storage)的视图(view)

张量知道如何将一对索引转换为存储中的某个位置,存储始终是一维的,与引用它的任何张量的维数无关。因此,更改存储的值当然也会更改引用它的张量的内容。可以说张量只是存储的一种表现形式view。

4.尺寸、存储偏移、步长

存储偏移,就是当前元素距离第一个元素隔了几个元素,步长,就是在某个维度上,例如:[0][1] ->[1][1],需要位移几个元素,需要位移几个,都是在Storage()上进行计算需要位移的个数的。

同时注意,张量转置后,它的尺寸和步长都会发生改变,但是它的存储和原来的张量是共享的。改变一个另一个也会发生改变,可以使用clone()。

同时转置后的张量不是contiguous的,可以使用contiguous方法使张量的存储变成连续的,有利提升性能。

5.数据类型

张量构造函数(即tensoroneszeros之类的函数)的dtype参数指定了张量中的数据类型。

  • torch.float32torch.float —— 32位浮点数
  • torch.float64torch.double —— 64位双精度浮点数
  • torch.float16torch.half —— 16位半精度浮点数
  • torch.int8 —— 带符号8位整数
  • torch.uint8 —— 无符号8位整数
  • torch.int16torch.short —— 带符号16位整数
  • torch.int32torch.int —— 带符号32位整数
  • torch.int64torch.long —— 带符号64位整数

每个torch.floattorch.double等等都有一个与之对应的具体类:torch.FloatTensortorch.DoubleTensor等等。torch.int8对应的类是torch.CharTensor,而torch.uint8对应的类是torch.ByteTensortorch.Tensortorch.FloatTensor的别名,即默认数据类型为32位浮点型。

数据类型转换有三种方法:

double_points = torch.zeros(10, 2).double()

double_points = torch.zeros(10, 2).to(torch.double)

short_points = points.type(torch.short)

6.索引张量

points[1:] # 第1行及之后所有行,(默认)所有列

points[1:, :] # 第1行及之后所有行,所有列

points[1:, 0] # 第1行及之后所有行,仅第0列

7.与numpy的互通性

例子:要从points张量创建NumPy数组,请调用:

         points = torch.ones(3, 4)

         points_np = points.numpy()

这种形式下,points和points_np共享内存,改变其中一个值,其他都会改变。

         a = np.array([1, 2, 3])
         b = torch.tensor(a)

这种情况下,不是共享内存的,改变一个,另一个不会改变。

8.序列化张量

当想要保存张量时,有两种方式,一种是保存为Pytorch可识别的,另一种是引入h5py库,利用numpy保存为可以通用的数据格式。

9.将张量引入到GPU上

张量存在device的概念,可以使用device = 'cuda',将其转移到GPU上运算,此时会在GPU上拷贝出一个张量。

10.张量API

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页