Tensorflow——模型保存与部署(下)

585 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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/")

9JQ4ZCQY3M({Q$KEN%9BFQX.png