TensorFlow 的内部数据保存在张量(Tensor)对象上, 所有的运算操作(Operation, 简称 op)也都是基于张量对象进行的. 复杂的神经网络算法本质上就是各种张量相乘、相加等基本运算操作的组合.
数据类型
数据类型分为 数值类型
, 字符串类型
, 布尔类型
.
1 | # float, str, bool 类型(python 内置) |
获取变量的类型 type(v)
, 判断变量是否是 TensorFlow 类型 tf.is_tensor(v)
, 获取 TensorFlow 变量的形状 v.shape
张量的类型
- Scalar 标量: 普通实数数字, Dimension 维度为
0
, Shape 为[]
- Vector 向量: n 个实数有序集合, 维度为
1
, Shape 为[n]
- Matrix 矩阵: m 行 ✖ n 列实数有序集合, 维度为
2
, Shape 为[m,n]
- Tensor 张量: 维度
>2
的实数有序集合数组. 比如图片张量 Shape 为 [数量,高,宽,通道数].
其中, Scalar Vector 和 Matrix 都看作是 Tensor 的特殊情况.
张量类型的应用
- 标量: Loss 误差值, Accuracy 准确度, Precision 精度, Recall 召回率, Step 训练步数,
- 向量:
𝒃
偏置向量. - 矩阵: shape[b,v] b 样本数(Batch size), v 特征长度.
- 3 维张量: shape[b,d,v], b 样本数, d 天数, v 特征长度. 多种商品(A,B,..)连续天数(60 天)内不同指标(价格,销量..)的张量.
- 4 维张量: shape[b,h,w,c], b 样本数, h 高度, w 宽度, c 通道数. 图片张量.
张量数值类型的精度
1 | # 指定精度为 int32 |
一般情况, 使用 int32, float32 就可以满足大部分计算需求. 如需要高精度运算时候, 再使用 int64, float64.
获取变量精度 v.dtype
, 判断精度 if v.dtype != tf.int32:
待优化张量
为了区分需要计算梯度信息的张量与不需要计算梯度信息的张量, TensorFlow 增加了一种专门的数据类型来支持梯度信息的记录: tf.Variable
.
tf.Variable
类型在普通的张量类型基础上添加了 name
, trainable
等属性来支持计算图的构建. 由于梯度运算会消耗大量的计算资源, 而且会自动更新相关参数, 对于不需要的优化的张量, 如神经网络的输入 𝑿
, 不需要通过 tf.Variable
封装; 相反, 对于需要计算梯度并优化的张量, 如神经网络层的 𝑾
和 𝒃
, 需要通过 tf.Variable
包裹以便 TensorFlow 跟踪相关梯度信息.
1 | pos = tf.constant([[-1, 0], [1, 2]]) |
获取待优化张量的名称 v.name
, 获取张量是否启用了优化 v.trainable
.
张量的创建
张量可以与 np.ndarray
, list
直接相互转换.
1 | # 显示转换类型 |
需要注意的是, list
转换后的数据一般情况默认为 tf.float32
, np.ndarray
转换后的数据默认为 tf.float64
.
全 0, 全 1, 自定义值
全 0 张量 tf.zeros(shape)
, 其中 shape 为 []
Scalar, [n]
Vector, [m,n]
Matrix, [m,n,u,v]
Tensor, s.shape
来源于其他 Tensor 张量
全 1 张量 tf.ones(shape)
, 与全 0 张量类似.
复制张量 shape 创建全 0 张量 tf.zeros_like(s)
同 tf.zeros(s.shape)
, 全 1 张量 tf.ones_like(s)
同 tf.ones(s.shape)
.
自定义值 tf.fill(shape, v)
, 张量形状来源于 shape, 默认值全部以实数 v
填充.
基于已知分布创建张量
正态分布(Normal Distribution, 又称为高斯分布 Gaussian Distribution) 一般用作 𝑾
的初始采样, 均匀分布(Uniform Distribution) 一般用作 𝒛
的初始采样.
基于正态分布创建张量: tf.random.normal(shape, mean=0.0, stddev=1.0)
可以创建形状为 shape, 均值为 mean, 标准差为 stddev 的正态分布 𝒩(mean, stddev2)
.
基于均匀分布创建张量: tf.random.uniform(shape, minval=0, maxval=None, dtype=tf.dtype)
, 可以创建形状为 shape, 区间为 [minval, maxval)
, 值类型为 dtype 的张量.
创建张量序列(向量)
通过 tf.range(start=0, limit=len, delta=1)
创建 start 为起点 delta 为步长的 limit 个数组成的序列. start 默认为 0, delta 默认为 1.
索引与切片
使用索引取值 v[m][n]..
或 v[m,n,...]
1 | # 创建 4D 图片张量 |
使用切片截取一个范围 v[start:end:step]
, start 默认 0, end 默认 len, step 默认 1, 可以选择性省略, 全省略情况 ::
可以简写成 :
. 其中切片截取不包含 end 位置值, 即为 [start,end)
. step 为负数表示逆序.
1 | # 创建 4D 图片张量 |
可以使用 ...
省略多个 :
全切片采样的维度, 避免出现 [:,:,:,0]
这样的情况.