
第3章 PyTorch与科学计算
3.1 算子字典
第1章已经对张量的概念进行了大致的介绍,读者也了解了一些常见算子及使用方法,本节主要罗列一些重要的算子及使用方法,在必要的时候读者可以将本节作为字典来查询。
为了方便读者理解,所有算子都以案例的形式给出,并结合实际的使用场景,使读者明白算子的含义及内在思想。
通过学习前面章节,读者对一些算子已经比较熟悉。本节主要列举PyTorch中重要的算子及使用案例,使读者可以更好地理解算子及其使用场景,做到心中有数,临阵不乱。下面先介绍torch模块中重要的算子。
torch模块中包含创建张量的方法及基于多维数据结构的多种数学操作,同时提供了多种工具,如序列化、CUDA支持等。3.1.1节主要介绍torch模块中提供的基本方法。
3.1.1 基本方法
(1)如何判断一个对象是否为Tensor?

(2)如何全局设置Tensor数据类型?

(3)如何判断一个对象是否为PyTorch Storage对象?

(4)如何获取Tensor中元素的个数?

(5)如何设置打印选项?

(6)如何创建指定形状的单位矩阵?

(7)如何从NumPy多维数组中创建Tensor?

(8)如何创建等差数列?


(9)和linspace类似的logspace返回一维张量,包含在区间10start和10end中,以对数刻度均匀间隔的steps个点,输出一维张量的长度为steps。

(10)如何创建单位矩阵?

(11)如何创建均匀分布的随机矩阵?(形状根据需求指定。)

(12)如何创建分布服从标准正态分布的随机矩阵?(形状根据需求指定。)

(13)如何创建一个随机的整数序列?(如同numpy.random.permutation。)

(14)如何创建一个列表如同NumPy中的arange?

(15)如何创建一个元素全为0的矩阵?

3.1.2 索引、切片、连接和换位
(1)如何将多个Tensor按照某个维度拼接起来?


(2)如何将一个Tensor按照指定维度切成n个分片?

(3)如何按照索引进行元素的聚合?

(4)如何按照索引选择目标数据?


(5)如何选出满足条件的矩阵元素?

(6)如何找出矩阵中非零元素的索引?

(7)如何将输入张量分割成相同形状的chunks?(注意和truck的区别。)


(8)如何增加一个矩阵的维度,如一维变成二维?

(9)如何去掉“[]”降低维度?(unsqueeze的逆操作;删除dim指定的维度。)

(10)如何实现Tensor维度之间的转置?

(11)如何获取沿着某个维度切片后所有的切片?

3.1.3 随机抽样
(1)如何设置随机种子?


(2)如何进行伯努利分布采样?

(3)如何进行多项式分布抽样?

(4)如何进行标准分布抽样?


正态分布采样的结果如图3.1所示。

图3.1 正态分布采样的结果
3.1.4 数据持久化与高并发
与很多框架一样,PyTorch对数据的处理提供了序列化接口与反序列化接口。通过序列化接口torch.save,可以将内存中的数据以文件的形式持久化到外部磁盘,通过torch.load方法可以将持久化的数据再次加载到内存。通过save接口和load接口可以实现多任务数据共享。
特别是模型训练产生的模型权重数据需要持久化,以产生模型文件,通过再次加载模型文件,重构模型,进而通过预测任务进行预测。

为了提升数据处理的能力,PyTorch采用并发设计的架构,默认使用机器的所有内核参与计算,并且并发数也等于内核个数,如图3.2所示。PyTorch通过get_num_threads方法和set_num_threads方法获取与设置并发量。


图3.2 默认并发数等于内核个数
3.1.5 元素级别的数学计算
“工欲善其事,必先利其器。”数据分析及算法岗位的很多需求都需要借助数学进行计算。PyTorch中提供了丰富的数学计算算子,本节主要介绍元素级别的数学计算方法,读者可以快速预览本节,感兴趣的读者可以实操练习。
元素级别的算子很容易掌握,有很多算子在实现上是类似的,因此放在同一个示例中讲解,这样便于对比和记忆。
(1)绝对值、求和、三角函数。

(2)相乘再相加、相除再相加。

(3)向上取整、向下取整、夹逼函数、乘法、取相反数、取倒数、取平方根倒数和取平方根。


(4)除法、余数、取小数、四舍五入和指数运算。


(5)自然对数、平滑对数、幂运算。

(6)线性插值。

(7)Sigmoid函数、sign符号函数、截断值。


3.1.6 规约计算
规约计算一般是指分组聚合计算,常见的规约计算有均值、方差等,该计算的特点是会使用分组内或所有元素参与计算得到统计性的结果。本节整理了常见的几种规约计算,并且提供了示例,读者可快速浏览,感兴趣的可亲自实践操作。
(1)累积、累和、所有元素的乘积、所有元素的和。


(2)p-norm距离。

(3)均值、中位数、众数、方差和标准差。


3.1.7 数值比较运算
数值比较运算主要包括比较数值大小、最小值、最大值、排序等操作。
(1)大于、大于或等于、小于、小于或等于和不相等。


(2)最大值和最小值。

(3)排序。

(4)topk。


3.1.8 矩阵运算
矩阵运算是现代计算机的基础,PyTorch提供了丰富的矩阵向量计算的方法,本节主要介绍这些矩阵操作。
(1)对角矩阵。

(2)矩阵的迹。


(3)上三角矩阵和下三角矩阵。

(4)矩阵的乘积mm和bmm。


(5)矩阵相乘再相加。

(6)批量矩阵相乘再相加。


(7)矩阵乘向量再相加。

(8)特征值及特征向量。

