文中程序以Tensorflow-2.6.0为例
部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。
本篇博客主要是工具性介绍,可能由于软件版本问题导致的部分内容无法使用。
首先介绍tflite: TensorFlow Lite 是一组工具,可帮助开发者在移动设备、嵌入式设备和 loT 设备上运行模型,以便实现设备端机器学习。
框架具有的主要特性:
- 延时(数据无需往返服务器)
- 隐私(没有任何个人数据离开设备)
- 连接性(无需连接互联网)
- 大小(缩减了模型和二进制文件的大小)
- 功耗(高效推断,且无需网络连接)
官方目前支持了大约130中可以量化的算子,在查阅大量资料后目前自定义的算子使用tflite导出任然存在较多问题。就解决常见的算法,使用支持的算子基本可以覆盖。tflite的压缩能力极强:使用官方算子构建的模型,导出TensorFlow Lite 二进制文件的大小约为 1 MB(针对 32 位 ARM build);如果仅使用支持常见图像分类模型(InceptionV3 和 MobileNet)所需的运算符,TensorFlow Lite 二进制文件的大小不到 300 KB。在后文的实例中我们用iris数据集的分类演示,可以导出一个仅仅只有2kb大小的模型权重相比未压缩的70kb模型缩小了30多倍。
同时tflite还实验性的在支持导出极轻量化的TFLM模型(TensorFlow Lite for Microcontrollers),这些模型可以直接在嵌入式单片机上进行推理,不过现阶段支持的算子还很少,简单的可以利用全连接和低向量卷积实现一些传感器参数的识别任务。现在主要的实例场景是MCU+IMU组合,识别IMU连续数据,来判断人体特定动作。同时开可以在MCU上离线运行语音命令识别,可以实现一个关键字的识别。
好了那我们继续看一下怎么保存模型,加载模型,保存tflite,加载tflite
保存权重或TF格式标准模型
通常情况下当完成了网络结构设计,数据处理,网络训练和评价之后需要及时的保存数据。先看到前面博客中已经介绍过的iris数据集实现网络分类任务。当时通过添加保存回调函数实现了网络权重的保存,这样保存下的是网络权重模型,需要配合网络结构的实例化使用。当然tf还提供了很多种模型的保存方式,tf2官方推荐使用tf形式保存,通过这种方式相关文件会保存到一个指定文件夹中,包含模型的权重参数模型结构信息。
ckpt格式
通过回调函数实现动态权重的保存。
import tensorflow as tf
from tensorflow.keras.layers import Dense
from tensorflow.keras import Model
from sklearn import datasets
import numpy as np
x_train = datasets.load_iris().data
y_train = datasets.load_iris().target
np.random.seed(116)
np.random.shuffle(x_train)
np.random.seed(116)
np.random.shuffle(y_train)
tf.random.set_seed(116)
# 定义网络结构
class IrisModel(Model):
def __init__(self):
super(IrisModel, self).__init__()
self.d1 = Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
def call(self, x):
y = self.d1(x)
return y
# 实例化化模型
model = IrisModel()
# 定义保存和记录数据的回调器
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath="./checkpoint/iris/iris.ckpt"