由于nnc模型量化工具对tflite格式支持较好,同时还支持.caffemodel与.onnx格式(未测),故需在电脑上将训练完成的模型转换为tflite格式后再进行量化,生成kmodel格式模型供K210单片机使用。
有关ncc_0.2相关使用,可以见该篇文章(留坑),或详见 GitHub网页

1、保存HDF5模型

以下代码为HDF5手写数字识别的代码,模型采用全连接层构成,使用relu为激活函数,使用“Dropout”和“提前停止”两种方法防止模型过拟合,同时增加模型泛化能力。

需要注意的是,由于mnist数据集是二维数组,而非图片,所以生成的模型无法使用ncc量化,但是可以通过设置float进行转换为kmodel,同时失去KPU加速能力。

import os
import tensorflow as tf
from tensorflow import keras
print(tf.version.VERSION)
#加载数据集(训练集、测试集)
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
#使用前1000个数据
train_labels = train_labels[:1000]
test_labels = test_labels[:1000]
#类归一化处理,将图像深度从0-255变为0-1
train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0
test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0
# 定义一个简单的序列模型
def create_model():
  model = tf.keras.models.Sequential([
      #全连接层模型,激活函数relu,输入维度784(28*28)
    keras.layers.Dense(512, activation='relu', input_shape=(784,)),
      #建立Dropout,防止过拟合,增加模型泛化能力,随机丢弃输入单元概率设置为0.2
    keras.layers.Dropout(0.2),
    keras.layers.Dense(10)
  model.compile(optimizer='adam',
                loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
                metrics=['accuracy'])
  return model
#以HDF5格式保存
# 创建并训练一个新的模型实例
model = create_model()
# patience 值用来检查改进 epochs 的数量
#当验证值没有提高上是自动停止训练。 我们将使用一个 EarlyStopping callback 来测试每个 epoch
#的训练条件。如果经过一定数量的 epochs 后没有改进,则自动停止训练。
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
#再次训练模型,显示日志verbose=1
model.fit(train_images, train_labels, epochs=50,
 validation_split = 0.2, verbose=1, callbacks=[early_stop])
#model.fit(train_images, train_labels, epochs=20)
# 将整个模型保存为 HDF5 文件。
# '.h5' 扩展名指示应将模型保存到 HDF5。
model.save('my_model.h5')
# 重新创建完全相同的模型,包括其权重和优化程序
new_model = tf.keras.models.load_model('my_model.h5')
# 显示网络结构
new_model.summary()
#检查准确性
loss, acc = new_model.evaluate(test_images,  test_labels, verbose=2)
print('Restored model, accuracy: {:5.2f}%'.format(100*acc))

2、转为tflite模型

import tensorflow as tf
from tensorflow.python.framework import ops
from tensorflow.python.ops import math_ops
from tensorflow.python.keras import backend as K
#自定义损失
def ReprojectionLoss(y_true, y_pred):
    y_pred = ops.convert_to_tensor_v2(y_pred)
    y_true = math_ops.cast(y_true, y_pred.dtype)
    y_pred = K.reshape(y_pred,(-1,27,2))
    y_true = K.reshape(y_true, (-1, 27, 2))
    return K.sqrt(K.mean(K.sum(math_ops.squared_difference(y_pred, y_true),axis=-1),axis=-1))
def ReprojectionMetrics(y_true,y_pred):
    return ReprojectionLoss(y_true, y_pred)
if __name__ == "__main__":
    # 将h5模型转化为tflite模型,my_model.h5是之前保存的模型
    modelparh = r'my_model.h5'
    model = tf.keras.models.load_model(modelparh, custom_objects = {'ReprojectionLoss': ReprojectionLoss, 'ReprojectionMetrics': ReprojectionMetrics})
    converter = tf.lite.TFLiteConverter.from_keras_model(model)
    tflite_model = converter.convert()
    #'model.tflite'是输出的文件名
    savepath = r'model.tflite'
    open(savepath, "wb").write(tflite_model)

4、参考资料

https://blog.csdn.net/weixin_35848967/article/details/109331651
https://github.com/kendryte/nncase/blob/master/docs/USAGE_ZH.md

0、引言由于nnc模型量化工具对tflite格式支持较好,同时还支持.caffemodel与.onnx格式(未测),故需在电脑上将训练完成的模型转换为tflite格式后再进行量化,生成kmodel格式模型供K210单片机使用。有关ncc_0.2相关使用,可以见该篇文章(留坑),或详见GitHub网页1、保存HDF5模型以下代码为HDF5手写数字识别的代码,模型采用全连接层构成,使用relu为激活函数,使用“Dropout”和“提前停止”两种方法防止模型过拟合,同时增加模型泛化能力。需要注意的是,由 def read_image_data(filename): infile = open(filename, "rb") magic_number = bytes_to_uint32(infile.read(4)) image_nu. output_model_file=os.path.join(logdir,"fashion_mnist_weights.h5")#在logdir中创建一个模型文件.h5 #定义一个callbacks数组 callbacks = [ keras... 直接修改callback的参数列表,9-2。 使用tf.SavedModel()保存模型 使用!saved_model_cli show --dir 路径 --all查看保存内容,可以看到关于输入和输出的签名信息。 使用命令行验证模型保存是否正确: !saved_model_cli run--dir 路径 --tag_set serve --signature_def servin...
深度学习迅猛发展,目前已经可以移植到移动端使用了,TensorFlow推出的TensorFlow Lite就是一款把深度学习应用到移动端的框架技术。 使用TensorFlowLite 需要tflite文件模型,这个模型可以由TensorFlow训练的模型转换而成。所以首先需要知道如何保存训练好的TensorFlow模型。 一般有这几种保存形式: Checkpoints SavedM...
bazel build tensorflow/python/tools:freeze_graph && \ bazel-bin/tensorflow/python/tools/freeze_graph \ --input_graph=eval_graph_def.pb \ --input_checkpoint=che... mode_file = "xxx_model.h5" #如果网络不存在备份文件,创建一个保存,路径可以自己定义 if not os.path.exists('xxx_model.h5'): print('=======================保存网络模型=======================') model.save('xxx_model.h5')
我们用keras训练模型后,通常保存模型格式类型为hdf5格式,也就是.h5文件。 但如果我们想要移植到移动端,特别是基于tensorflow支持的移动端,那就需要转换tflite格式。 如何转换呢?在tensorflow1.9及以上版本,支持通过命令行方式方便进行转换tflite_convert --output_file=/home/yourname/Documents/te...
NNCase v0.2.0 Beta4 1.首先要下载NNCase工具箱. 2.创建一个文件夹,将下载好的ncc.exe,.tflite文件,训练模型时的图片(5张即可)放入文件夹内. 3.打开cmd,并打开当前文件夹 ncc compile <.tflite的文件名称> <.kmodel的文件名称> -i model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(10) # 编译模型 model.compile(optimizer=tf.keras.optimizers.Adam(.01), loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True), metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=5) # 保存模型参数 model.save_weights('model_weights.h5') 在训练完成后,可以使用 `model.save_weights()` 方法来保存模型参数。这个方法会将模型参数保存到一个 HDF5 文件中,可以在以后重新加载模型时使用。