Tensorflow SavedModel 在加载时忽略资产文件

Tensorflow SavedModel ignoring Assets File on Load

我微调了来自 Tensorflow hub 的 BERT 模型以构建一个简单的情绪分析器。该模型训练并运行良好。在导出时,我简单地使用了:

tf.saved_model.save(model, export_dir='models')

这工作得很好..直到我重新启动。

重启后,模型不再加载。我试过使用 Keras 加载器和 Tensorflow 服务器,但我得到了同样的错误。

我收到以下错误消息:

Not found: /tmp/tfhub_modules/09bd4e665682e6f03bc72fbcff7a68bf879910e/assets/vocab.txt; No such file or directory

该模型正在尝试从 tfhub 模块缓存中加载资产,该缓存会因重启而被擦除。我知道我可以保留缓存,但我不想这样做,因为我希望能够生成模型,然后将它们复制到单独的应用程序中,而不必担心缓存。

关键是我认为根本没有必要在缓存中查找资产。该模型保存在一个资产文件夹中,其中生成了 vocab.txt,因此为了找到资产,它只需要在它自己的资产文件夹中查找(我认为)。然而,它似乎并没有这样做。

有什么办法可以改变这种行为吗?


添加了构建和导出模型的代码(这不是一个聪明的模型,只是对我的工作流程进行原型设计):

bert_model_name = "bert_en_uncased_L-12_H-768_A-12"

BATCH_SIZE = 64
EPOCHS = 1 # Initial

def build_bert_model(bert_model_name):
    input_layer = tf.keras.layers.Input(shape=(), dtype=tf.string, name="inputs")
    preprocessing_layer = hub.KerasLayer(
        map_model_to_preprocess[bert_model_name], name="preprocessing"
    )

    encoder_inputs = preprocessing_layer(input_layer)
    bert_model = hub.KerasLayer(
        map_name_to_handle[bert_model_name], name="BERT_encoder"
    )
    outputs = bert_model(encoder_inputs)

    net = outputs["pooled_output"]
    net = tf.keras.layers.Dropout(0.1)(net)
    net = tf.keras.layers.Dense(1, activation=None, name="classifier")(net)
    return tf.keras.Model(input_layer, net)

def main():
    train_ds, val_ds = load_sentiment140(batch_size=BATCH_SIZE, epochs=EPOCHS)
    steps_per_epoch = tf.data.experimental.cardinality(train_ds).numpy()
    init_lr = 3e-5

    optimizer = tf.keras.optimizers.Adam(learning_rate=init_lr)
    model = build_bert_model(bert_model_name)

    model.compile(optimizer=optimizer, loss='mse', metrics='mse')
    model.fit(train_ds, validation_data=val_ds, steps_per_epoch=steps_per_epoch)

    tf.saved_model.save(model, export_dir='models')

这个问题来自一个 TensorFlow bug triggered by versions /1 and /2 of https://tfhub.dev/tensorflow/bert_en_uncased_preprocess。更新的模型 tensorflow/bert_*_preprocess/3(上周五发布)避免了这个错误。请更新到最新版本。

Classify Text with BERT教程已相应更新。

感谢您提出这个问题!