快速了解 TensorFlow 基础 (五) 进阶运算

合并与分割

Concatenate 拼接

Concatenate 拼接是在某个维度上数据的拼接, 不产生新的维度.

tf.concat([a,b], axis) 在 axis 维度上, 合并两个张量, 除了 axis 维度, 要求其余维度 shape 必须相同.

Stack 堆叠

Stack 堆叠是在原有维度基础上, 创建一个新的维度, 然后在此维度上进行拼接.

tf.stack([a,b], axis) 堆叠两个张量, axis >= 0 从左向右在 axis 位置之前, axis < 0 从右向左在 axis 之后插入新的维度, 之后在此维度上进行拼接, 要求堆叠的张量 shape 完全相同.

Split 分割

tf.split(x, num_or_size_splits, axis) 表示在 axis 维度上, 对张量 x 进行分割, 分割完后 axis 维度还在, 即使维度长度为 1. num_or_size_splits 是整数表示等长平均分割, 是 List 表示按照 list 给定的长度进行分割.

例如: shape [9,2] 按照 tf.split(x, 3, 0) 分割成为 3 个 shape [3,2], 按照 tf.split(x, [2,2,5], 0) 分割成为 2 个 shape [2,2] 和 1 个 [5,2].

tf.unstack(x, axis) 表示在 axis 维度上, 以 1 为固定长度进行分割, 分割完后 axis 维度机消失.

数据统计

Norm 范数

范数表征向量 “长度” 的一种度量方法.

  • L1 范数: $x$ 向量的所有元素的绝对值之和 $\begin{Vmatrix}x\end{Vmatrix}1 = \sum{i=0}^{n}{|x_i|}$
  • L2 范数: $x$ 向量的所有元素的平方和的开方 $\begin{Vmatrix}x\end{Vmatrix}2 = \sum{i=0}^{n}\sqrt{|x_i|^2}$
  • $\infty$ 范数: $x$ 向量的所有元素的绝对值的最大值 $\begin{Vmatrix}x\end{Vmatrix}_{\infty} = max_i(|x_i|)$

tf.norm(x, ord) 计算范数, 其中 ord 取值为 1, 2tf.inf.

计数, 均值, 最值, 和, 最值索引

  • tf.reduce_max(x, axis) 求某维度或全局最大值
  • tf.reduce_min(x, axis) 求某维度或全局最小值
  • tf.reduce_mean(x, axis) 求某维度或全局均值
  • tf.reduce_sum(x, axis) 求某维度或全局和

上面 4 个函数, axis 表示某个维度, 负数表示从右往左. 省略表示求全局.

  • tf.size(x) 求张量的总元素个数
  • tf.argmax(x, axis) 求某维度上最大值所在的索引
  • tf.argmin(x, axis) 求某维度上最小值所在的索引

误差

loss = keras.losses.mse(y, out) 求误差, loss_mean = tf.reduce_mean(loss) 求平均误差.

归一化指数函数

归一化指数函数(softmax 函数),是逻辑函数的一种推广, 可以将数据向量转换为该位置概率的向量.

将一个含任意实数的 K 维向量 z 压缩 到另一个 K 维实向量 σ(z) 中,使得每一个元素的范围都在(0,1)之间,并且所有元素的和为 1.

张量比较

tf.math.equal(a,b) 比较两个张量个位置数据是否相等返回与张量 a 或 b 的 shape 相同的判断结果张量. 与之类似的有:

  • equal(x,y) x=y
  • not_equal(x,y) x!=y
  • greater(x,y) x>y
  • greater_equal(x,y) x>=y
  • less(x,y) x<y
  • less_equal(x,y) x<=y
  • is_nan(x) x=nan

数据限幅

数据规整到一定范围内, 超出范围的指定到范围边界.

  • tf.maximum(x,a) x>=a
  • tf.minimun(x,b) x<=b
  • tf.clip_by_value(x, a, b) a <= x <= b

数据归集提取

tf.gather(x, list, axis) 提取 $x$ 向量 axis 轴上 list 列举的序号位置 $i$ 的列表的数据(其余的剔除). tf.gather(x, [1,3,7], 0) 表示 x 的 0 坐标轴 1,3,7 位置的 3 个数据.

tf.gather_nd(x, list) 相对于 tf.gather list 列举的是数据的详细位置 $[a,b,c…]$ 的列表数据(其余的剔除). tf.gather_nd(x, [[1,2],[3,2],[7,2]]) 表示 x 张量的 [1,2],[3,2],[7,2] 三个位置的数据.

tf.boolean_mask(x, mask) 可以实现 gather 和 gather_nd 的功能, mask 是 True 和 False 的张量.

tf.where(cond, a, b) 其中 cond, a, b 的 shape 一致, 并且 cond 是布尔张量. cond 值为 True 取对应位置 a 的值, False 取对应位置 b 的值.

tf.where(cond) 省略 a, b 则 返回所有 cond 为 True 的位置索引.

tf.scatter_nd(indices, updates, shape) updates 数据 拓展到 shape 形状, 拓展后的数据位置为 indices.

tf.meshgrid(x, y) 返回数据将 行向量 x 复制 y 份 [len(y), x] , 列向量 y 复制 x 份[y, len(x)]

数据集加载操作

经典数据集

  • Boston Housing 波士顿房价, 用于回归模型训练
  • CIFAR10/100 真实图片分类任务, 用于图片分类
  • MNIST/Fashion_MNIST 手写数字图片数据集, 用于图片分类
  • IMDB 情感分类任务数据, 用于文本分类

数据集的自动获取

tf.keras.datasets.mnist.load_data() 加载数据集 mnist, 不存在自动下载数据集. 网络不好可以在开始下载后, 出现正在下载数据的地址后停止下载, 使用迅雷下载该数据后放到 ~/.keras/datasets 路径下, 重新执行加载.

1
2
3
4
5
6
7
8
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets

# 加载数据集, 是 Numpy 数组
(x, y), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
# Numpy 转换成 Dataset 对象
train_db = tf.data.Dataset.from_tensor_slices((x, y))

数据集常用操作

shuffle 打散乱序

为了防止每次执行都是相同的数据顺序

train_db.shuffle(buffer_size) buffer_size 一般情况参数给一个比较大的数就行, 比如 10000.

batch 设置并行计算

train_db.batch(parallel) parallel 是 GPU 进行计算的并行单位.

map 自定义预处理函数

train_db.map(preprocess) 其中 preprocess 是自定义函数, 接收 (x,y) 元组作为参数, 需要返回处理后的 (x,y) 元组.

step 和 epoch 循环

对数据集进行 epoch + step 双层循环, 或者通过 train_db.repeat() 设置 epoch 循环次数 + step 单层循环的方式, 可以对模型进行训练.

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.