我使用了这个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'有人可以建议我做错了什么,或者我是否应该做一些其他的事情来加载这个模型?谢谢!
发布于 2021-11-17 20:37:35
由于所提供的笔记本不再可用,我将假定您正在使用这个(官方的?) BERT implementation for thensorflow,因为我在使用它时遇到了同样的问题。
由于subclassed model和(可能) this layer中缺少适当的get_config方法,您无法加载模型。您需要编辑BERT编码器类(如果您可以这样做)。
我在尝试修改BERT model并应用屏蔽语言建模训练时遇到了这个问题。我发现由于前面提到的KeyError: 'name',我无法加载检查点。我发现了三个问题:
Custom mask layers require a config and must override...我修复了我的实现中的层,然而问题是我意识到KeyError: 'name'来自模型的get_config implementation,它没有产生tf.keras.Model原始配置和new config dict。在这种特殊情况下,这不是由于缺少层配置(通常是这种情况)。我在implementation:中修补了子类模型的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()))KeyError: 'name' (使用第2点中的代码。)创建了一个新的更可怕的错误(在加载/保存期间也是如此)。出现了500多行包含WARNING:tensorflow:Unresolved object in checkpoint...和Inconsistent references when loading the checkpoint into this object graph...的错误/警告,但加载仍然失败。我发现这是由于BERT模型跟踪各层的方式造成的(第484-491行)。这些层在保存时也被序列化了。我不确定为什么要将这些成员添加到编码器类中,但是通过删除它们,我能够在没有任何其他问题的情况下保存和加载模型。很抱歉有这么长的历史,但是,嘿,这是解释它的唯一方法…
发布于 2020-09-29 14:25:54
正如它所说的,name没有被定义。model = tf.keras.models.load_model('./saved_model/test')指向路径(文件夹) ./saved_model/test,而不是模型的路径。
发布于 2020-11-14 05:13:51
我在这里记录了我的KeyError经验(以及我找到的解决方案):
https://github.com/tensorflow/models/issues/8692#issuecomment-727033061
这是由于自定义层的get_config()没有使用父级的基本配置的糟糕实现,该基本配置包含keras重新加载所必需的name密钥。
https://stackoverflow.com/questions/62413757
复制相似问题