将模型另存为H5或SavedModel时,TensorFlow Hub错误

时间:2019-07-27 06:11:21

标签: python tensorflow tensorflow-serving

我想使用此TF Hub资产: https://tfhub.dev/google/imagenet/resnet_v1_50/feature_vector/3

版本:

Version:  1.15.0-dev20190726
Eager mode:  False
Hub version:  0.5.0
GPU is available

代码

feature_extractor_url = "https://tfhub.dev/google/imagenet/resnet_v1_50/feature_vector/3"
feature_extractor_layer = hub.KerasLayer(module,
                                         input_shape=(HEIGHT, WIDTH, CHANNELS))

我得到:

ValueError: Importing a SavedModel with tf.saved_model.load requires a 'tags=' argument if there is more than one MetaGraph. Got 'tags=None', but there are 2 MetaGraphs in the SavedModel with tag sets [[], ['train']]. Pass a 'tags=' argument to load this SavedModel.

我尝试过:

module = hub.Module("https://tfhub.dev/google/imagenet/resnet_v1_50/feature_vector/3",
                    tags={"train"})
feature_extractor_layer = hub.KerasLayer(module, 
                                         input_shape=(HEIGHT, WIDTH, CHANNELS))

但是当我尝试保存模型时,我得到了:

tf.keras.experimental.export_saved_model(model, tf_model_path)
# model.save(h5_model_path) # Same error 

NotImplementedError: Can only generate a valid config for `hub.KerasLayer(handle, ...)`that uses a string `handle`.
Got `type(handle)`: <class 'tensorflow_hub.module.Module'>

教程here

2 个答案:

答案 0 :(得分:1)

已经有一段时间了,但假设您已迁移到 TF2,这可以使用最新的模型版本轻松完成,如下所示:

import tensorflow as tf
import tensorflow_hub as hub

num_classes=10 # For example
m = tf.keras.Sequential([
    hub.KerasLayer("https://tfhub.dev/google/imagenet/resnet_v1_50/feature_vector/5", trainable=True)
    tf.keras.layers.Dense(num_classes, activation='softmax')
])
m.build([None, 224, 224, 3])  # Batch input shape.

# train as needed

m.save("/some/output/path")

如果这对您不起作用,请更新此问题。我相信您的问题是由 hub.Modulehub.KerasLayer 混合引起的。您使用的模型版本是 TF1 Hub 格式,因此在 TF1 中它只能与 hub.Module 一起使用,不能与 hub.KerasLayer 混合使用。在 TF2 中,hub.KerasLayer 可以直接从其 URL 加载 TF1 Hub 格式的模型以组合成更大的模型,但无法对其进行微调。

请参阅this compatibility guide了解更多信息

答案 1 :(得分:-1)

您应该使用tf.keras.models.save_model(model,'NeuralNetworkModel') 您将把保存的模型保存在一个文件夹中,以后可以在顺序工作中使用