在 Keras 3 中,由于不再直接支持 TensorFlow 的 .pb
(SavedModel/冻结图) 格式,转换 .pb
到 .h5
需要借助 TensorFlow 进行中间转换。以下是几种可行的方法:
方法 1:TensorFlow 加载 .pb
并保存为 .h5
(推荐)
如果 .pb
是 SavedModel 格式(通常是一个目录,包含 saved_model.pb
和 variables/
):
import tensorflow as tf
from tensorflow import keras
# 1. 用 TensorFlow 加载 SavedModel
model = tf.keras.models.load_model("path/to/your_model.pb") # 或目录路径
# 2. 保存为 .h5 格式
model.save("converted_model.h5", save_format="h5")
适用情况:
✅ SavedModel 格式(TensorFlow 2.x 导出)
✅ 标准 Keras/TensorFlow 模型(无自定义层)
方法 2:如果是冻结的 .pb
(GraphDef 格式)
如果 .pb
是 冻结的 TensorFlow 1.x 模型(如 frozen_inference_graph.pb
),需先转换为 Keras 模型:
import tensorflow as tf
from tensorflow import keras
import numpy as np
# 1. 加载冻结的 .pb
def load_frozen_graph(pb_path):
with tf.io.gfile.GFile(pb_path, "rb") as f:
graph_def = tf.compat.v1.GraphDef()
graph_def.ParseFromString(f.read())
return graph_def
graph_def = load_frozen_graph("frozen_model.pb")
# 2. 转换为 Keras 模型(需知道输入/输出层名)
with tf.compat.v1.Session() as sess:
tf.compat.v1.import_graph_def(graph_def, name="")
input_tensor = sess.graph.get_tensor_by_name("input:0") # 替换为你的输入层名
output_tensor = sess.graph.get_tensor_by_name("output:0") # 替换为你的输出层名
# 构建 Keras 模型
model = keras.models.Model(inputs=input_tensor, outputs=output_tensor)
# 3. 保存为 .h5
model.save("converted_model.h5", save_format="h5")
适用情况:
✅ TensorFlow 1.x 冻结模型
❌ 需要知道 输入/输出层名(如 input:0
、output:0
)
方法 3:使用 TFSMLayer
(仅推理,不能保存)
如果只需要 推理,可用 TFSMLayer
加载 .pb
,但 不能保存为 .h5
:
import keras
model = keras.Sequential([
keras.layers.TFSMLayer(
"path/to/your_model.pb",
call_endpoint="serving_default", # 可能需要调整
)
])
# 尝试保存(会失败,TFSMLayer 不支持保存)
try:
model.save("converted.h5", save_format="h5")
except Exception as e:
print("TFSMLayer 不能直接保存为 .h5:", e)
适用情况:
✅ 仅推理
❌ 不能保存为 .h5
方法 4:ONNX 转换(跨框架方案)
如果 TensorFlow 方法不适用,可尝试:
1. .pb
→ ONNX → Keras .h5
- 用 tf2onnx
转换 .pb
为 .onnx
:
bash
python -m tf2onnx.convert --saved-model path/to/model.pb --output model.onnx
- 再用 onnx2keras
转成 Keras:
```python
from onnx2keras import onnx_to_keras
import onnx
onnx_model = onnx.load("model.onnx")
keras_model = onnx_to_keras(onnx_model, ["input_name"])
keras_model.save("converted.h5")
```
总结
方法 | 适用情况 | 是否可训练 | 可保存为 .h5 |
---|---|---|---|
TensorFlow load_model |
SavedModel 格式 | ✅ Yes | ✅ Yes |
冻结 .pb 转换 |
TF1.x 冻结模型 | ❌ No | ✅ Yes |
TFSMLayer |
仅推理 | ❌ No | ❌ No |
ONNX 转换 | 跨框架方案 | ✅ Yes | ✅ Yes |
推荐方案
- 如果是 SavedModel → 直接用
tf.keras.models.load_model()
+.save("model.h5")
- 如果是冻结
.pb
→ 用tf.GraphDef
提取层并重建模型 - 如果仅需推理 → 用
TFSMLayer
- 如果其他方法失败 → 尝试 ONNX 转换
如果有具体模型结构问题,可以提供 模型架构 或 错误信息,我可以进一步优化转换方案! 🚀