如何将训练好的TensorFlow.Keras.Sequential模型导出为FMU文件
将Keras神经网络模型转换为FMU格式的步骤
1. 保存训练好的Keras模型
在你的训练代码末尾添加保存逻辑,把模型存为Keras支持的格式:
# 保存训练完成的模型 model.save("trained_nn_model.h5") # 也可使用SavedModel格式:model.save("trained_nn_model")
2. 安装必要依赖
执行以下命令安装转换所需的工具库:
pip install fmpy tensorflow numpy
3. 封装模型并导出FMU
通过fmpy将Keras模型的预测逻辑封装为符合FMI规范的FMU,示例代码如下:
import numpy as np import tensorflow as tf from fmpy import export_fmu # 加载已保存的模型 trained_model = tf.keras.models.load_model("trained_nn_model.h5") # 定义FMU的预测逻辑 def nn_predict(inputs): # 转换输入格式以匹配模型要求 input_array = np.array(inputs, dtype=np.float32).reshape(1, -1) # 执行预测并关闭日志输出 prediction = trained_model.predict(input_array, verbose=0) # 展平输出适配FMU格式 return prediction.flatten() # 导出FMU文件 export_fmu( function=nn_predict, # 定义输入变量,数量与模型输入特征数一致 inputs=[(f"feature_{i}", "real") for i in range(trained_model.input_shape[1])], # 定义输出变量 outputs=[("prediction", "real")], model_name="NeuralNetworkFMU", # 指定FMI版本,可选2.0或3.0 fmi_version="2.0", save_path="NeuralNetworkFMU.fmu" )
4. 验证FMU正确性
用fmpy模拟FMU,对比其输出与原模型是否一致:
from fmpy import simulate_fmu import numpy as np # 生成测试输入,维度匹配模型输入 test_features = np.random.rand(trained_model.input_shape[1]) # 运行FMU模拟 sim_result = simulate_fmu( "NeuralNetworkFMU.fmu", start_time=0, stop_time=1, input={f"feature_{i}": test_features[i] for i in range(trained_model.input_shape[1])}, output=["prediction"] ) # 对比输出结果 fmu_output = sim_result["prediction"][-1] model_output = trained_model.predict(test_features.reshape(1, -1), verbose=0)[0][0] print(f"原模型输出: {model_output:.6f}") print(f"FMU输出: {fmu_output:.6f}")
注意事项
- 确保FMU定义的输入变量数量与模型输入特征数完全匹配
- 若需使用FMI 3.0标准,只需修改
export_fmu中的fmi_version参数为"3.0" - 含自定义层或复杂逻辑的模型,需提前验证自定义代码在FMU运行环境中的兼容性
内容的提问来源于stack exchange,提问作者aborammez
相关产品推荐
相关产品推荐

