张量基本概念:
张量其实就是tensor,和tensorflow里的基础数据结构相同,本质就是N维数组;
张量的提出本质是为了优化底层数学计算速度;
C++和python这种解释型语言相比之所以有优越性,本质就是因为所有类似于内置类型的数值都是采用连续内存直接存储;
而python则是以对象类型进行存储,存储都需要大量的空间,更别说数值计算;
因此,tensor主要目的就是模拟类C的底层存储计算;
对于pytorch中张量的基础形式如下所示:
当然,对于多维数组,可以有如下形式,以tensor为初始化函数单位,python多维列表进行初始化;
张量的存储方式:
张量主要由tensor.Storage来进行存储管理,但是无论是几维数组,都会映射到一维情况;
按照书上的论述,是按照逐行-逐列展开为一维;
但是感觉知道这个没啥卵用,因为一般不直接修改,知道就行;
张量的尺寸、存储偏移和步长:
尺寸:相当于numpy中的shape,指出该数据结构中的尺寸大小,类似于m*n矩阵;
步长:为了获得每个维度下的元素需要跳过的元素数量;
偏移:存储中与张量中第一个元素相对应的索引;
通俗理解:
由于tensor在内存中以一维数组形式存储,所以必须要记录矩阵信息,;
尺寸、偏移、步长就是作为存储信息进行数据定位为目标存在的;
不同维度的张量也是根据三者来计算索引;
如果对一个矩阵进行转置,修改的也是这三个信息,并不影响storage中的存储形式;
如下图所示:
为了方便数值计算,常常采用contiguous方法来把转置后的非连续张量stroage转化为连续;
从上述可以基本看出contiguous的基本用法,即将一个非连续storage可以转换为一个连续的storage;
关于tensor的数据类型:
基础的tensor类型如下所示:
tensor中可以指定数据类型,可以在tensor初始化值列表中使用dtype进行指定;
对于类型转换可以直接采用to函数或者type函数,或者直接调用.double()等进行转换;
这里不再赘述;
索引张量:
类似于python中list的切片,主要针对与tensor维度进行处理:
points[1:] # 第1行及之后所有行,(默认)所有列 points[1:, :] # 第1行及之后所有行,所有列 points[1:, 0] # 第1行及之后所有行,仅第0列
如上所示;
Tensor和Numpy的相互转换:
tensor张量和numpy数组可以进行无缝衔接;
由于两者可以根据缓冲协议进行转换:
如果想从tensor变为numpy,直接采用.numpy()即可;
同理,如果想从numpy转化为tensor,直接调用.from_numpy(numpy)即可;
序列化张量:
序列化张量即张量的存储;
可以使用torch自带的open()和load()函数进行张良的存储,缺点是无法使得其他软件进行读取;
也可以使用HDF5库和格式来进行存储;
import h5py f = h5py.File('../../data/chapter2/ourpoints.hdf5', 'w') dset = f.create_dataset('coords', data=points.numpy()) f.close()
f = h5py.File('../../data/chapter2/ourpoints.hdf5', 'r') dset = f['coords'] last_points = dset[1:]
当然也可以根据切片来进行访问,如上所示;
书中本章节仅仅作为入门,详细仍然需要参观https://pytorch-cn.readthedocs.io/zh/latest/;