在 Keras 3 中,由于不再直接支持 TensorFlow 的 .pb(SavedModel/冻结图) 格式,转换 .pb.h5 需要借助 TensorFlow 进行中间转换。以下是几种可行的方法:


方法 1:TensorFlow 加载 .pb 并保存为 .h5(推荐)

如果 .pbSavedModel 格式(通常是一个目录,包含 saved_model.pbvariables/):

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:0output: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.onnxbash 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

推荐方案

  1. 如果是 SavedModel直接用 tf.keras.models.load_model() + .save("model.h5")
  2. 如果是冻结 .pbtf.GraphDef 提取层并重建模型
  3. 如果仅需推理TFSMLayer
  4. 如果其他方法失败尝试 ONNX 转换

如果有具体模型结构问题,可以提供 模型架构错误信息,我可以进一步优化转换方案! 🚀