tensorflow - 无法加载 SavedModel
问题描述
我正在使用 tf.keras 训练一些模型,并希望保存训练后的模型。有两种推荐的方法,tfSavedModel
和 keras.h5
文件。然而,事情变得非常混乱SavedModel
。
以下是一些重现该问题的简短脚本:
import numpy as np
import tensorflow as tf
def my_network():
backbone_model = tf.keras.applications.InceptionResNetV2(
include_top=False, input_shape=(224, 224, 3), weights="imagenet", pooling="avg"
)
inputs = tf.keras.layers.Input(shape=(224, 224, 3), name="images")
backbone_features = backbone_model(inputs)
pre_embeddings = tf.keras.layers.Dense(
512,
activation=None,
name="pre_embeddings",
kernel_regularizer=tf.keras.regularizers.l2(),
)(backbone_features)
embeddings = tf.keras.layers.Lambda(
lambda x: tf.math.l2_normalize(x, 1, 1e-10), name="embeddings"
)(pre_embeddings)
probs = tf.keras.layers.Dense(
1000,
activation="softmax",
name="predictions",
kernel_regularizer=tf.keras.regularizers.l2(),
bias_regularizer=tf.keras.regularizers.l2(),
)(pre_embeddings)
return tf.keras.Model(inputs, [embeddings, probs], name="my_network")
img_arr = np.random.rand(1, 224, 224, 3)
resnet_model = my_network()
emb_1, _ = resnet_model.predict(img_arr)
resnet_model.save("./resnet_model.h5")
new_model = tf.keras.models.load_model('./resnet_model.h5')
emb_2, _ = new_model.predict(img_arr)
np.testing.assert_array_almost_equal(emb_1, emb_2)
上面的脚本可以正常工作。但是,当我尝试以SavedModel
格式保存时(通过.h5
从模型路径中删除),它失败了。模型保存成功,但加载时报错,报错信息为:
NotImplementedError: When subclassing the `Model` class, you should implement a `call` method.
我很困惑,因为我没有使用任何子类模型。如脚本所示,我的网络仅使用功能 API 构建。
解决方案
推荐阅读
- javascript - Random large number calculator shows nothing
- python - 如何在不从列表中重复配对的情况下制作两个配对
- python - 如何解决使用 google_images_download 库的脚本的问题 - 可能与互联网/ssl/代理有关的问题?
- database - 我的 firebase 数据库的结构方式是否会影响使用 geofire 的 firebase 的可扩展性?
- javascript - 如何从 api 获取和渲染图像?
- html - How can I manage which class' background color to take action, if I have an element with a class list?
- authentication - SPA 中可访问性的注销路径或功能
- c++ - 名称查找似乎不适用于嵌套类
- linux - Split httpd-vhosts.conf into multiple virtual host files
- ios - 如何在 swiftUI 中创建一个普通视图