张量:
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.数据类型
张量构造函数(即tensor
、ones
、zeros
之类的函数)的dtype
参数指定了张量中的数据类型。
torch.float32
或torch.float
—— 32位浮点数torch.float64
或torch.double
—— 64位双精度浮点数torch.float16
或torch.half
—— 16位半精度浮点数torch.int8
—— 带符号8位整数torch.uint8
—— 无符号8位整数torch.int16
或torch.short
—— 带符号16位整数torch.int32
或torch.int
—— 带符号32位整数torch.int64
或torch.long
—— 带符号64位整数
每个torch.float
、torch.double
等等都有一个与之对应的具体类:torch.FloatTensor
、torch.DoubleTensor
等等。torch.int8
对应的类是torch.CharTensor
,而torch.uint8
对应的类是torch.ByteTensor
。torch.Tensor
是torch.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