携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情
在上一篇文章中,我们介绍模型保存与部署,进行Keras模型转化为,签名函数转化为SavedModelSavedModel,签名函数、SavedModel和keras模型到具体函数转换方法的价绍
今天我们来介绍tflite保存与理解与量化
-
3.1 调用tf.lite.TFLiteConverter.from_keras_model这个API将keras model 转化为tflite
keras_to_tflite_converter = tf.lite.TFLiteConverter.from_keras_model(
loaded_keras_model)
keras_tflite = keras_to_tflite_converter.convert()
- 将转化的tflite写入文件中
if not os.path.exists('./tflite_models'):
os.mkdir('./tflite_models')
with open('./tflite_models/keras_tflite', 'wb') as f:
f.write(keras_tflite)
-
3.2 调用tf.lite.TFLiteConverter.from_concrete_functions将concrete_function 转化为tflite
concrete_func_to_tflite_converter = tf.lite.TFLiteConverter.from_concrete_functions([keras_concrete_func])
concrete_func_tflite = concrete_func_to_tflite_converter.convert()
写入文件中:
with open('./tflite_models/concrete_func_tflite', 'wb') as f:
f.write(concrete_func_tflite)
-
3.2 调用tf.lite.TFLiteConverter.from_saved_model将SavedModel 转化为tflite
saved_model_to_tflite_converter = tf.lite.TFLiteConverter.from_saved_model('./keras_saved_graph/')
saved_model_tflite = saved_model_to_tflite_converter.convert()
写入文件夹中:
with open('./tflite_models/saved_model_tflite', 'wb') as f:
f.write(saved_model_tflite)
-
4.1 使用tflite interpreter运行模型
读取tflite,创建一个interpreter
allocate_tensors:给tflite中的所有函数分配内存
with open('./tflite_models/concrete_func_tflite', 'rb') as f:
concrete_func_tflite = f.read()
interpreter = tf.lite.Interpreter(
model_content = concrete_func_tflite)
interpreter.allocate_tensors()
使用get_input_details和get_output_details查看输入和输出:
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
print(input_details)
print(output_details)
运行结果:
[{'name': 'x', 'index': 0, 'shape': array([ 1, 28, 28], dtype=int32), 'shape_signature': array([-1, 28, 28], dtype=int32), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0), 'quantization_parameters': {'scales': array([], dtype=float32), 'zero_points': array([], dtype=int32), 'quantized_dimension': 0}, 'sparsity_parameters': {}}]
[{'name': 'Identity', 'index': 12, 'shape': array([ 1, 10], dtype=int32), 'shape_signature': array([-1, 10], dtype=int32), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0), 'quantization_parameters': {'scales': array([], dtype=float32), 'zero_points': array([], dtype=int32), 'quantized_dimension': 0}, 'sparsity_parameters': {}}]
我们发现input_dedtails是一个字典,字典中由name,index,shape_signature,quantization(量化)等信息,输出也是由name,index,shape_signature,quantization这些信息
创建一个数据,调用interpreter.invoke的方法来执行一个预测,然后获取输出。
input_data = tf.constant(
np.ones(input_details[0]['shape'], dtype=np.float32))
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_results = interpreter.get_tensor(output_details[0]['index'])
print(output_results)
运行结果:
[[0.12054978 0.13891366 0.06380308 0.02520141 0.03194021 0.01083281
0.05653546 0.14580397 0.3768253 0.0295944 ]]
-
4.2给tflite做量化
其实给tflite做了量化比较直接,直接给每一个converter设置一个optimizations
例如:
keras_to_tflite_converter.optimizations = [
tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
concrete_func_to_tflite_converter.optimizations = [
tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
saved_model_to_tflite_converter.optimizations = [
tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
在文件夹中可以看到,对于普通的tflite,它的大小是1.07MB,而对于quantized之后的大小只有272kB,大小都是原来的1/4,这是32位变成8位的空间缩小
-
4.3 tensorflowjs转换模型
- tensorFlow.js 是一个库,用于使用JavaScript开发和训练机器学习模型,以及在浏览器中或Node.js 上部署模型
4.3.1 keras model 到tfjs_layers的转换
!tensorflowjs_converter --input_format keras \
--output_format tfjs_layers_model \
./graph_def_and_weights/fashion_mnist_model.h5 \
./tfjs_models/keras_to_tfjs_layers
4.3.2 keras model 到tfjs_graph的转换
!tensorflowjs_converter --input_format keras \
--output_format tfjs_graph_model \
./graph_def_and_weights/fashion_mnist_model.h5 \
./tfjs_models/keras_to_tfjs_graph
4.3.3 tf_saved_model 到tfjs_model的转换
!tensorflowjs_converter --input_format tf_saved_model \
--output_format tfjs_graph_model \
./keras_saved_graph/ \
./tfjs_models/saved_model_to_tfjs_model
4.3.4 tf_saved_model是不能转换位tfjs_layers
!tensorflowjs_converter --input_format tf_saved_model \
--output_format tfjs_layers_model \
./keras_saved_graph/ \
./tfjs_models/saved_model_to_tfjs_layers
运行会得到一个错误
使用python代码来转换:
import tensorflowjs as tfjs
tfjs.converters.save_keras_model(loaded_model,
"./tfjs_models/keras_to_tfjs_layers_py/")