当前位置: 首页 > news >正文

24- 深度学习的模型保存和加载 (TensorFlow系列) (深度学习)

知识要点

keras 保存成hdf5文件, 1.保存模型和参数, 2.只保存参数

  • 1.保存模型和参数
    • save_model
    • callback ModelCheckpoint
  • 2. 只保存参数
    • save_weights
    • callback ModelCheckpoint save_weights_only = True

保存模型:

  • 案例数据: Fashion-MNIST总共有十个类别的图像
  • model.save_weights(os.path.join(logdir, 'fashion_mnist_weights_2.h5'))      # 保存参数的方法
  • 加载参数: model.load_weights(os.path.join(logdir, 'fashion_mnist_weight.h5'))
  • 保存模型: model.save(os.path.join(logdir, 'fashion_mnist_model.h5'))
  • 加载模型: model2 = keras.models.load_model(os.path.join(logdir, 'fashion_mnist_model.h5'))
  • 把keras模型保存成savedmodel格式: tf.saved_model.save(model, './keras_saved_model')


一 模型保存和部署

  • TFLite是为了将深度学习模型部署在移动端和嵌入式设备的工具包,可以把训练好的TF模型通过转化、部署和优化三个步骤,达到提升运算速度,减少内存、显存占用的效果。
  • TFlite主要由Converter和Interpreter组成。Converter负责把TensorFlow训练好的模型转化,并输出为.tflite文件(FlatBuffer格式)。转化的同时,还完成了对网络的优化,如量化。Interpreter则负责把.tflite部署到移动端,嵌入式(embedded linux device)和microcontroller,并高效地执行推理过程,同时提供API接口给Python,Objective-C,Swift,Java等多种语言。简单来说,Converter负责打包优化模型,Interpreter负责高效易用地执行推理
  • Fashion-MNIST总共有十个类别的图像。每一个类别由训练数据集6000张图像和测试数据集1000张图像。所以训练集和测试集分别包含60000张和10000张。测试训练集用于评估模型的性能。

  • 每一个输入图像的高度和宽度均为28像素。数据集由灰度图像组成。Fashion-MNIST,中包含十个类别,分别是t-shirt,trouser,pillover,dress,coat,sandal,shirt,sneaker,bag,ankle boot。

1.1 模型创建

  • 导包
# 导包
from tensorflow import keras
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
  • 时尚数据导入
# 时尚数据导入
fashion_mnist = keras.datasets.fashion_mnist
(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()
x_valid, x_train = x_train_all[:5000], x_train_all[5000:]
y_valid, y_train = y_train_all[:5000], y_train_all[5000:]
  • 标准化
# 标准化
from sklearn.preprocessing import StandardScaler    # preprocessing 预处理
scaler = StandardScaler()x_train_scaled = scaler.fit_transform(x_train.astype(np.float32).reshape(-1, 784))
x_valid_scaled = scaler.fit_transform(x_valid.astype(np.float32).reshape(-1, 784))
x_test_scaled = scaler.fit_transform(x_test.astype(np.float32).reshape(-1, 784))
  • 创建模型
# 创建模型
model = keras.models.Sequential([keras.layers.Dense(512, activation = 'relu', input_shape = (784, )),keras.layers.Dense(256, activation = 'relu'),keras.layers.Dense(128, activation = 'relu'),keras.layers.Dense(10, activation = 'softmax')])model.compile(loss = 'sparse_categorical_crossentropy',optimizer = 'adam',metrics = ['accuracy'])

1.2 保存模型

# 保存模型
import os
logdir = './graph_def_and_weights'
if not os.path.exists(logdir):os.mkdir(logdir)output_model_file = os.path.join(logdir, 'fashion_mnist_weight.h5')
callbacks = [keras.callbacks.TensorBoard(logdir),  # 保存地址# 保存效果最好的模型: save_best_onlykeras.callbacks.ModelCheckpoint(output_model_file,    save_best_only = True, save_weights_only = True),keras.callbacks.EarlyStopping(patience = 5, min_delta = 1e-3)]   history = model.fit(x_train_scaled, y_train, epochs = 10,validation_data= (x_valid_scaled, y_valid),callbacks = callbacks)

  • 保存模型
# 保存模型
output_model_file2 = os.path.join(logdir, 'fashion_mnist_model.h5')
model.save(output_model_file2)
  •  保存参数

# 另一种保存参数的方法
model.save_weights(os.path.join(logdir, 'fashion_mnist_weights_2.h5'))
  • 模型评估
# evaluate 评估
model.evaluate(x_valid_scaled, y_valid)   # [0.35909169912338257, 0.88919997215271]
  • 模型加载
# 加载模型
model2 = keras.models.load_model(output_model_file2)
model2.evaluate(x_valid_scaled, y_valid)  # [0.35909169912338257, 0.88919997215271]

二 保存模型为savemodel格式

# 把keras模型保存成savedmodel格式
tf.saved_model.save(model, './keras_saved_model')
  •  读取模型
# 加载savedmodel模型
loaded_saved_model = tf.saved_model.load('./keras_saved_model')
loaded_saved_model

 2.1 另一种保存

# 保存模型
import os
logdir = './graph_def_and_weights'
if not os.path.exists(logdir):os.mkdir(logdir)output_model_file = os.path.join(logdir, 'fashion_mnist_weight.h5')
model.load_weights(output_model_file)

三 tflite_interpreter 的使用

  • 导包
from tensorflow import keras
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
import os
with open('./tflite_models/concrete_func_tf_lite', 'rb') as f:concrete_func_tflite = f.read()
  • 创建interpreter
# 创建interpreter
interpreter = tf.lite.Interpreter(model_content = concrete_func_tflite)
# 分配内存
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
  • 预测数值
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)

四 to_concrete_function

  • 加载文件
# 从文件加载
loaded_keras_model = keras.models.load_model('./graph_def_and_weights/fashion_mnist_model.h5')
loaded_keras_model(np.ones((1, 784)))

  • 把keras模型转化为concrete function
# 把keras模型转化为concrete function
run_model = tf.function(lambda x: loaded_keras_model(x))
keras_concrete_func = run_model.get_concrete_function(tf.TensorSpec(loaded_keras_model.inputs[0].shape,loaded_keras_model.inputs[0].dtype))
# 使用
keras_concrete_func(tf.constant(np.ones((1, 784), dtype = np.float32)))

五 to_quantized_tflite

5.1 keras to tflite

# 从文件加载
loaded_keras_model = keras.models.load_model('./graph_def_and_weights/fashion_mnist_model.h5')
loaded_keras_model
# lite 精简版模型   # 创建转化器
keras_to_tflite_converter = tf.lite.TFLiteConverter.from_keras_model(loaded_keras_model)
keras_to_tflite_converter
# 给converter添加量化的优化  # 把32位的浮点数变成8位整数
keras_to_tflite_converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]# 执行转化
keras_tflite = keras_to_tflite_converter.convert()
# 写入指定文件
import os
if not os.path.exists('./tflite_models'):os.mkdir('./tflite_models')with open('./tflite_models/quantized_keras_tflite', 'wb') as f:f.write(keras_tflite)

5.2 concrete function to tflite

# 把keras模型转化成concrete function
run_model = tf.function(lambda x: loaded_keras_model(x))
keras_concrete_func = run_model.get_concrete_function(tf.TensorSpec(loaded_keras_model.inputs[0].shape,loaded_keras_model.inputs[0].dtype))
concrete_func_to_tflite_converter = tf.lite.TFLiteConverter.from_concrete_functions([keras_concrete_func])
concrete_func_to_tflite_converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
concrete_func_tflite = concrete_func_to_tflite_converter.convert()
with open('./tflite_models/quantized_concrete_func_tf_lite', 'wb') as f:f.write(concrete_func_tflite)

5.3 saved_model to tflite

saved_model_to_tflite_converter = tf.lite.TFLiteConverter.from_saved_model('./keras_saved_model/')
saved_model_to_tflite_converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
saved_model_tflite = saved_model_to_tflite_converter.convert()
with open('./tflite_models/quantized_saved_model_tflite', 'wb') as f:f.write(saved_model_tflite)

http://www.lryc.cn/news/26525.html

相关文章:

  • 【Echarts图例点击事件】自定义Echarts图例legend点击事件(已解决)
  • uniapp-首页配置
  • 支持DDR5,超频更简单,小雕够给力,技嘉B760M小雕WIFI主板上手
  • fengMap 自定义dom 偏离实际位置;缩放时飘出地图所在区域
  • TryHackMe-黑我杯
  • 【JAVA程序设计】【C00109】基于SSM(非maven)的员工工资管理系统
  • 《计算机原理》——HelloWorld.cpp如何运行的
  • 【面试题】在JS循环中使用await会怎么样?
  • Qt QMessageBox详解
  • Flutter之beamer路由入门指南
  • 「基础篇」机器学习概览
  • 揭秘可视化图探索工具 NebulaGraph Explore 是如何实现图计算的
  • 移动架构43_什么是Jetpack
  • TiDB的分布式事务原理探究
  • 【C语言】函数指针和指针函数
  • Nodejs中npx简介和作用
  • Matplotlib精品学习笔记001——绘制3D图形详解+实例讲解
  • 学习ifconfig实战技巧,成为网络管理高手
  • day38|70. 爬楼梯(进阶)、322. 零钱兑换、279.完全平方数
  • SpringBoot全局异常处理
  • SpringBoot异常处理
  • 《C++ Primer Plus》(第6版)第8章编程练习
  • RAD Studio 11.3 Alexandria Crack
  • Stm32 iic 协议使用
  • Malware Dev 02 - Windows SDDL 后门利用之 SCManager
  • 每日一题29——山峰数组的顶部
  • Linux- 系统随你玩之--好用到炸裂的系统级监控、诊断工具
  • 第十三节 继承
  • 【优化】性能优化Springboot 项目配置内置Tomcat使用Http11AprProtocol(AIO)
  • SpringBoot之@ConfigurationProperties、@EnableConfigurationProperties