1. 工具
1.1 TensorFlow模型格式
文件格式 | 扩展名 | 说明 |
---|---|---|
CheckPoint | *.ckpt | 1) 在训练 TensorFlow 模型时,每迭代若干轮需要保存一次 权值到磁盘,称为“checkpoint” 2) 这种格式文件是由 tf.train.Saver() 对象调用 saver.save() 生成的 3) 只包含若干 Variables 对象序列化后的数据,不包含图结构,所以只给 checkpoint 模型不提供代码是无法重新构建计算图的 |
GraphDef | *.pb *.pbtxt *.meta | 1) 这种格式文件包含 protobuf 对象序列化后的数据,包含了计算图,可以从中得到所有(运算符operators)的细节,也包含张量(tensors)和 Variables 定义 2) 但不包含 Variable 的值(不含权值),因此只能从中恢复计算图,但一些训练的权值仍需要从 checkpoint 中恢复 3) .pb 为二进制文件,实际上 protobuf 也支持文本格式(.pbtxt),但包含权值时文本格式会占用大量磁盘空间,一般不用 |
SavedModel | 图:.pb或.pbtxt | 1) 该格式为 GraphDef 和 CheckPoint 的结合体,另外还有标记模型输入和输出参数的 SignatureDef 2) 从 SavedModel 中可以提取 GraphDef 和 CheckPoint 对象 3) 在使用 TensorFlow Serving 时,会用到这种格式的模型 4) 其中 saved_model.pb(或 saved_model.pbtxt)包含使用 MetaGraphDef protobuf 对象定义的计算图;assets 包含附加文件;variables 目录包含 tf.train.Saver() 对象调用 save() API 生成的文件 |
TensorFlow Lite model | *tflite *lite | 1) 轻量级模型格式 |
- 使用方法
- 部署在线服务(Serving)时官方推荐使用 SavedModel 格式
- 部署到手机等移动端的模型一般使用 FrozenGraphDef 格式(最近推出的 TensorFlow Lite 也有专门的轻量级模型格式 *.lite,和 FrozenGraphDef 十分类似)
- 这些格式之间关系密切,可以使用 TensorFlow 提供的 API 来互相转换。
1.2 MediaPipe
- On-Device, Real-Time Hand Tracking with MediaPipe介绍
- Hand Detection(GPU)文档
- MediaPipe是一个框架,可用于构建应用了多功能(例如,视频,音频,任何时间序列数据)应用的机器学习管道。 使用MediaPipe,可以将感知管道构建为模块化组件图,如:推理模型(inference models)(例如TensorFlow,TFLite)和媒体处理功能。
- 机器学习 功能
- 手势检测流程
2. 常用激活函数
3. tf.keras
3.1 创建学习模型
3.1.1 Sequential (顺序模型)
- 由多个网络层线性堆叠
- Load dataset (准备数据)
# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras
# Load dataset
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# Preprocess the data
train_images = train_images / 255.0
test_images = test_images / 255.0
- Build the model (创建层并加入到model)
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28,28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
- Compile the model (配置模型训练过程)
- Loss function(损失函数):在训练期间,用于衡量模块的准确性,使用模型朝着此损失最小化的方向前进
- Optimizer(优化方法):定义基于模型看到的数据及其损失函数来更新模型的方式
- Metrics(指标):用于监视训练和测试过程的指标
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
- Train the mode(训练模型)
model.fit(train_images, train_labels, epochs=10)
- Evaluate accuracy (评估准确性)
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
- Make predictions (预测数据类别)
predictions = model.predict(test_images)
print("\n The first test image:", predictions[0])
print("The fist test image label:", test_labels[0])
plt.figure()
plt.imshow(test_images[0])
plt.colorbar()
plt.grid(False)
plt.show()
3.1.2 Functional (函数模型)
- 允许构建任意的神经网络图
3.2 网络层
3.2.1 tf.keras.layers.Flatten
- 功能:把二维图像变为一维数组 (按行转换为一维数组)
- 此层无学习参数,只是重新组织数据
- 示例:
import tensorflow as tf
from tensorflow import keras
layer = keras.layers.Flatten(input_shape=(28, 28))
3.2.2 tf.keras.layers.Dense
- 功能:全连接层, output = activation(dot(input, kernel) + bias)
- kernel: 是本层待学习的权重矩阵参数
- bias:是本层待学习的偏移向量
- 参数:
- units: 定义本层输出的节点数(nodes)或神经元数(neurons)
- activation: 定义本层的激活函数 ,若不指定,则为:a(X) = X
- use_bias: Boolean, 定义本层使用使用偏移量
- kernel_initializer: 待学习的权重矩阵的初始化方法(字符串)
- bias_initializer: 待学习的偏移向量的初始化方法(字符串)
- kernel_regularizer: 应用于权重矩阵的正则化函数
- bias_regularizer: 应用于偏移向量的正则化函数
- activity_regularizer: 应用于输出层 (its “activation”)的正则化函数
- kernel_constraint:应用于权重矩阵的约束函数
- bias_constraint: 应用于偏移向量的约束函数
- 默认初始值
def __init__(self,
units,
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs):
if 'input_shape' not in kwargs and 'input_dim' in kwargs:
kwargs['input_shape'] = (kwargs.pop('input_dim'),)
super(Dense, self).__init__(
activity_regularizer=regularizers.get(activity_regularizer), **kwargs)
self.units = int(units)
self.activation = activations.get(activation)
self.use_bias = use_bias
self.kernel_initializer = initializers.get(kernel_initializer)
self.bias_initializer = initializers.get(bias_initializer)
self.kernel_regularizer = regularizers.get(kernel_regularizer)
self.bias_regularizer = regularizers.get(bias_regularizer)
self.kernel_constraint = constraints.get(kernel_constraint)
self.bias_constraint = constraints.get(bias_constraint)
self.supports_masking = True
self.input_spec = InputSpec(min_ndim=2)