1. 从TensorFlow到ONNX:模型转换第一步
当你训练好一个TensorFlow模型后,第一步就是要把它转换成K230开发板能识别的格式。这里我强烈推荐使用ONNX作为中间格式,而不是直接转成tflite。为什么?因为在实际项目中我发现,tflite对动态输入形状的支持不太友好,经常会在后续的kmodel转换环节出问题。
先来看个简单的例子。假设我们训练了一个预测Y=2X-1的线性回归模型:
python复制import tensorflow as tf
import numpy as np
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
# 构建模型
model = Sequential([Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')
# 训练数据
xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)
# 训练
model.fit(xs, ys, epochs=500)
训练完成后,我们需要分两步转换:
- 先保存为SavedModel格式
- 再用tf2onnx转换成ONNX
python复制# 保存模型
model.save('linear_model')
# 转换为ONNX
import os
os.system("python3 -m tf2onnx.convert --saved-model linear_model --output model.onnx --opset 11")
这里有个坑要注意:opset版本。我实测发现K230对opset 11支持最好,太高或太低的版本都可能导致后续转换失败。转换完成后,强烈建议用onnx.checker验证一下:
python复制import onnx
onnx_model = onnx.load("./m
