【问题标题】:Loading a saved BertClassifer model加载保存的 BertClassifer 模型
【发布时间】:2020-06-16 16:57:34
【问题描述】:

我正在使用此 colab 笔记本中的以下示例: https://github.com/tensorflow/models/blob/master/official/colab/fine_tuning_bert.ipynb

它使用 model.save() 功能保存微调的模型。

我正在尝试使用 tf.keras.models.load_model() 加载相同的模型,但出现以下错误:

KeyError: 'name'
KeyError                                  Traceback (most recent call last)
in engine
----> 1 model = tf.keras.models.load_model('./saved_model/test')

/home/cdsw/.local/lib/python3.6/site-packages/tensorflow/python/keras/saving/save.py in load_model(filepath, custom_objects, compile)
    183     if isinstance(filepath, six.string_types):
    184       loader_impl.parse_saved_model(filepath)
--> 185       return saved_model_load.load(filepath, compile)
    186 
    187   raise IOError(

/home/cdsw/.local/lib/python3.6/site-packages/tensorflow/python/keras/saving/saved_model/load.py in load(path, compile)
    114   # TODO(kathywu): Add saving/loading of optimizer, compiled losses and metrics.
    115   # TODO(kathywu): Add code to load from objects that contain all endpoints
--> 116   model = tf_load.load_internal(path, loader_cls=KerasObjectLoader)
    117 
    118   # pylint: disable=protected-access

/home/cdsw/.local/lib/python3.6/site-packages/tensorflow/python/saved_model/load.py in load_internal(export_dir, tags, loader_cls)
    605       loader = loader_cls(object_graph_proto,
    606                           saved_model_proto,
--> 607                           export_dir)
    608       root = loader.get(0)
    609       if isinstance(loader, Loader):

/home/cdsw/.local/lib/python3.6/site-packages/tensorflow/python/keras/saving/saved_model/load.py in __init__(self, *args, **kwargs)
    186     self._models_to_reconstruct = []
    187 
--> 188     super(KerasObjectLoader, self).__init__(*args, **kwargs)
    189 
    190     # Now that the node object has been fully loaded, and the checkpoint has

/home/cdsw/.local/lib/python3.6/site-packages/tensorflow/python/saved_model/load.py in __init__(self, object_graph_proto, saved_model_proto, export_dir)
    121       self._concrete_functions[name] = _WrapperFunction(concrete_function)
    122 
--> 123     self._load_all()
    124     self._restore_checkpoint()
    125 

/home/cdsw/.local/lib/python3.6/site-packages/tensorflow/python/keras/saving/saved_model/load.py in _load_all(self)
    207     # loaded from config may create variables / other objects during
    208     # initialization. These are recorded in `_nodes_recreated_from_config`.
--> 209     self._layer_nodes = self._load_layers()
    210 
    211     # Load all other nodes and functions.

/home/cdsw/.local/lib/python3.6/site-packages/tensorflow/python/keras/saving/saved_model/load.py in _load_layers(self)
    307         continue
    308 
--> 309       layers[node_id] = self._load_layer(proto.user_object, node_id)
    310 
    311     for node_id, proto in metric_list:

/home/cdsw/.local/lib/python3.6/site-packages/tensorflow/python/keras/saving/saved_model/load.py in _load_layer(self, proto, node_id)
    333     # Detect whether this object can be revived from the config. If not, then
    334     # revive from the SavedModel instead.
--> 335     obj, setter = self._revive_from_config(proto.identifier, metadata, node_id)
    336     if obj is None:
    337       obj, setter = revive_custom_object(proto.identifier, metadata)

/home/cdsw/.local/lib/python3.6/site-packages/tensorflow/python/keras/saving/saved_model/load.py in _revive_from_config(self, identifier, metadata, node_id)
    350     else:
    351       obj = (
--> 352           self._revive_graph_network(metadata, node_id) or
    353           self._revive_layer_from_config(metadata, node_id))
    354 

/home/cdsw/.local/lib/python3.6/site-packages/tensorflow/python/keras/saving/saved_model/load.py in _revive_graph_network(self, metadata, node_id)
    386     else:
    387       model = models_lib.Functional(
--> 388           inputs=[], outputs=[], name=config['name'])
    389 
    390     # Record this model and its layers. This will later be used to reconstruct

KeyError: 'name'

谁能告诉我我做错了什么,或者我是否应该做其他事情来加载这个模型?谢谢!

【问题讨论】:

    标签: python tensorflow keras tensorflow-model-garden


    【解决方案1】:

    由于提供的笔记本不再可用,我假设您正在使用这个(官方?)BERT implementation for thensorflow 因为我遇到了同样的问题。


    TL;DR:由于在 subclassed model 和(可能)this layer 中缺少正确的 get_config 方法,您无法加载模型。您需要编辑 BERT 编码器类(如果您可以这样做的话)。


    我在尝试修改BERT model 并应用蒙面语言建模培训时遇到了这个问题。我发现由于提到的KeyError: 'name',我无法加载检查点。 我发现了三个问题:

    1. 经过大量测试,我发现在保存期间有几层会产生警告,警告指出 Custom mask layers require a config and must override... 我在实现中修复了这些层,但问题仍然存在。
    2. 后来我意识到KeyError: 'name' 来自模型的get_config implementation,它没有产生tf.keras.Model 原始配置以及new config dict。在这种特殊情况下,这不是由于缺少层配置(通常是这种情况)。我在我的实现中修补了子类模型get_config 方法:
    
    def get_config(self):
        # Implement get_config to enable serialization. This is NOT optional.
        base_config = super(LayoutEncoder, self).get_config()
        return dict(list(self._config.items()) + list(base_config.items()))
    
    1. 解决KeyError: 'name'(使用第 2 点中的代码)创建了一个新的更可怕的错误(也在加载/保存期间)。出现了超过 500 行包含WARNING:tensorflow:Unresolved object in checkpoint...Inconsistent references when loading the checkpoint into this object graph... 的错误/警告,并且加载仍然失败。我发现这是由 BERT 模型跟踪层的方式引起的(第 484-491 行)。这些层也在保存期间被序列化。我不确定为什么将这些成员添加到编码器类中,但是通过删除它们,我能够保存和加载模型而没有任何其他问题。

    对不起,历史悠久,但恕我直言,这是解释它的唯一方法......

    【讨论】:

    • 感谢您的精彩解释。我一直面临着同样的问题。我只是有一个问题,你做了什么来解决第一点。您是否也更改了SelfAttentionMask 层实现?
    • 实际上第一点并没有解决任何问题,我认为那些警告是无害的。我所做的是将“get config()”方法添加到“SelfAttentionMask”层。我现在意识到我谈论的其他层实际上是我自己的代码的一部分,而不是 repo 实现的一部分。
    【解决方案2】:

    如前所述,name 未定义。 model = tf.keras.models.load_model('./saved_model/test') 指向路径(文件夹)./saved_model/test,而不是模型的路径。

    【讨论】:

      【解决方案3】:

      我在这里记录了我对 KeyError 的体验(以及我找到的解决方案):

      https://github.com/tensorflow/models/issues/8692#issuecomment-727033061

      这是由于自定义层的 get_config() 的错误实现未使用父级的基本配置,它确实包含 name 键,这是 keras 重新加载所必需的。

      【讨论】:

        猜你喜欢
        • 2021-12-15
        • 2019-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-06
        • 1970-01-01
        • 2019-04-12
        相关资源
        最近更新 更多