【问题标题】:How to save a model in Tensorflow?如何在 Tensorflow 中保存模型?
【发布时间】:2019-10-15 14:31:49
【问题描述】:

您好,我正在为图像分类任务使用相关权重。我正在使用 Tensorflow 版本 1.14.0,我正在使用 mobilenetv1_050_224 来执行以下source 中的任务。

IMAGE_SHAPE = (400, 400)
n_classes = 10
classifier_url = 'https://tfhub.dev/google/imagenet/mobilenet_v1_050_224/classification/3'
base_model = hub.Module(classifier_url, tags=['train'])
base_model.trainable = False
classifier = tf.keras.Sequential([
    hub.KerasLayer(base_model, input_shape=IMAGE_SHAPE+(3,)),
    keras.layers.Dense(n_classes, activation='softmax')
])
#print (base_model.summary())
print (classifier.summary())

我训练了这个模型,并且能够使用迁移学习在我的数据集上获得良好的训练/验证准确性。以下是学习部分的代码。

train_datagen = keras.preprocessing.image.ImageDataGenerator(
                rescale=1./255)

validation_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow(
    x = train_dataset,
    y = train_labels,
    batch_size=batch_size,
    seed=1)

validation_generator = validation_datagen.flow(
    x = validation_dataset, # Source directory for the validation images
    y = valid_labels,
    batch_size=batch_size,
    seed=1)

classifier.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.01, beta_1=0.9, beta_2=0.999),
              loss='categorical_crossentropy',
              metrics=['accuracy'])
epochs = 2
steps_per_epoch = train_generator.n // batch_size
validation_steps = validation_generator.n // batch_size

model = classifier.fit_generator(train_generator,
                                 steps_per_epoch = steps_per_epoch,
                                 epochs=epochs,
                                 workers=4,
                                 validation_data=validation_generator,
                                 validation_steps=validation_steps)

但是当我尝试保存模型时:

export_path = '/tmp/simple_keras_model.h5'
classifier.save(export_path, save_format='h5')

我收到以下错误:

NotImplementedError:只能为 hub.KerasLayer(handle, ...)使用字符串handle

得到type(handle)

我被它困住了,无法绕开它。这方面的任何线索都会有所帮助。谢谢你。

【问题讨论】:

  • 你能不能把路径中的\tmp\部分去掉,用simple_keras_model.h5试试保存。

标签: python tensorflow


【解决方案1】:

您可以通过

保存classifier
# save the underlying  tensorflow graph
model_file = classifier.to_json()
with open("model.json", "w") as source:
    source.write(model_file)
# save model parameter 
classifier.save_weights("model_weights.h5")

然后保存的模型就可以被加载了

from keras.models import model_from_json

with open("model.json", "r") as f:
    classifier = model_from_json(f.read())
classifier.load_weights("model_weights.h5")

【讨论】:

  • 我在这一行遇到了同样的错误:model_file = classifier.to_json()
  • 对不起,我以为是保存模型的方式导致了问题。我不熟悉hub,我猜问题是classifier 不是由hub 正确构造的。
  • 我想我知道问题所在。问题是我正在使用 hub.keraslayer() 和 hub.load(classifier_url) 之类的集线器模块。但是它在文档中说:句柄:一个可调用对象(受上述约定),或者一个 Python 字符串, hub.load() 为其返回这样一个可调用对象。需要一个字符串来保存该层的 Keras 配置。所以为了保存模型,我需要将字符串传递给 hub.keraslayer() 而不是 hub 模块。
  • 我发现了一个issue 报告了你遇到的同样的问题,还有这个post
【解决方案2】:

这个怎么样?

# Export the model to a SavedModel
keras.experimental.export_saved_model(classifier, '/tmp/simple_keras_model.h5')

# Recreate the exact same model
new_model = keras.experimental.load_from_saved_model('/tmp/simple_keras_model.h5')

Source

【讨论】:

    【解决方案3】:

    正如link 中提到的,只有兼容 TF2 的 Hub 模块才能与 hub.Keras 一起使用。

    但可以使用 SavedModel 来保存它。 SavedModel API的使用方法请参考link

    【讨论】:

      猜你喜欢
      • 2023-02-09
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2021-09-10
      相关资源
      最近更新 更多