TensorFlow2.X学习笔记(3)--TensorFlow低阶API之张量
TensorFlow的低阶API主要包括张量操作
,计算图
和自动微分
。
如果把模型比作一个房子,那么低阶API就是【模型之砖】。
在低阶API层次上,可以把TensorFlow当做一个增强版的numpy来使用。
TensorFlow提供的方法比numpy更全面,运算速度更快,如果需要的话,还可以使用GPU进行加速。
一、张量的结构操作
张量的操作主要包括张量的结构操作和张量的数学运算。
张量结构操作诸如:张量创建,索引切片,维度变换,合并分割
。
张量数学运算主要有:标量运算,向量运算,矩阵运算
。另外我们会介绍张量运算的广播机制。
Autograph计算图我们将介绍使用Autograph的规范建议,Autograph的机制原理,Autograph和tf.Module.
1、创建张量
1 | import tensorflow as tf |
2、索引切片
张量的索引切片方式和numpy几乎是一样的。切片时支持缺省参数和省略号。
对于tf.Variable
,可以通过索引和切片对部分元素进行修改。
对于提取张量的连续子区域,也可以使用tf.slice
.
此外,对于不规则的切片提取,可以使用tf.gather,tf.gather_nd,tf.boolean_mask
。
tf.boolean_mask
功能最为强大,它可以实现tf.gather,tf.gather_nd
的功能,并且tf.boolean_mask
还可以实现布尔索引。
如果要通过修改张量的某些元素得到新的张量,可以使用tf.where,tf.scatter_nd
。
1 | tf.random.set_seed(3) |
3、维度变换
维度变换相关函数主要有 tf.reshape, tf.squeeze, tf.expand_dims, tf.transpose.
tf.reshape
可以改变张量的形状。tf.squeeze
可以减少维度。如果张量在某个维度上只有一个元素,利用tf.squeeze
可以消除这个维度。tf.expand_dims
可以增加维度。tf.transpose
可以交换维度,它会改变张量元素的存储顺序。tf.transpose
常用于图片存储格式的变换上。
tf.reshape可以改变张量的形状,但是其本质上不会改变张量元素的存储顺序,所以,该操作实际上非常迅速,并且是可逆的。
1 | tf.expand_dims(s,axis=0) #在第0维插入长度为1的一个维度 |
4、合并分割
tf.concat
和tf.stack
有略微的区别,tf.concat是连接,不会增加维度,而tf.stack是堆叠,会增加维度。
1 | a = tf.constant([[1.0,2.0],[3.0,4.0]]) |
tf.split
是tf.concat的逆运算,可以指定分割份数平均分割,也可以通过指定每份的记录数量进行分割。
1 | #tf.split(value,num_or_size_splits,axis) |
二、张量的数学运算
1、标量运算
1 | a = tf.constant([[1,2],[3,4]]) |
2、向量运算
向量运算符只在一个特定轴上运算,将一个向量映射到一个标量或者另外一个向量。 许多向量运算符都以reduce开头。
1 | #向量reduce |
3、矩阵运算
矩阵运算包括:矩阵乘法,矩阵转置,矩阵逆,矩阵求迹,矩阵范数,矩阵行列式,矩阵求特征值,矩阵分解等运算。大部分和矩阵有关的运算都在
tf.linalg
子包中。
1 | #矩阵乘法 |
4、广播机制
- 1、如果张量的维度不同,将维度较小的张量进行扩展,直到两个张量的维度都一样。
- 2、如果两个张量在某个维度上的长度是相同的,或者其中一个张量在该维度上的长度为1,那么我们就说这两个张量在该维度上是相容的。
- 3、如果两个张量在所有维度上都是相容的,它们就能使用广播。
- 4、广播之后,每个维度的长度将取两个张量在该维度长度的较大值。
- 5、在任何一个维度上,如果一个张量的长度为1,另一个张量长度大于1,那么在该维度上,就好像是对第一个张量进行了复制。
tf.broadcast_to
以显式的方式按照广播机制扩展张量的维度。
1 | a = tf.constant([1,2,3]) |