【发布时间】:2020-09-28 11:40:29
【问题描述】:
我正在尝试将 Keras 模型保存在 H5 文件中。 Keras 模型有一个自定义层。 当我尝试恢复模型时,我收到以下错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-5-0fbff9b56a9d> in <module>()
1 model.save('model.h5')
2 del model
----> 3 model = tf.keras.models.load_model('model.h5')
8 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/utils/generic_utils.py in class_and_config_for_serialized_keras_object(config, module_objects, custom_objects, printable_module_name)
319 cls = get_registered_object(class_name, custom_objects, module_objects)
320 if cls is None:
--> 321 raise ValueError('Unknown ' + printable_module_name + ': ' + class_name)
322
323 cls_config = config['config']
ValueError: Unknown layer: CustomLayer
能否请您告诉我应该如何保存和加载所有自定义 Keras 层的权重? (另外,保存时没有提示,能不能从我已经保存但现在无法加载的H5文件中加载模型?)
这是针对此错误的最小工作代码示例 (MCVE),以及完整的扩展消息:Google Colab Notebook
为了完整起见,这是我用来制作自定义层的代码。
get_config 和 from_config 都工作正常。
class CustomLayer(tf.keras.layers.Layer):
def __init__(self, k, name=None):
super(CustomLayer, self).__init__(name=name)
self.k = k
def get_config(self):
return {'k': self.k}
def call(self, input):
return tf.multiply(input, 2)
model = tf.keras.models.Sequential([
tf.keras.Input(name='input_layer', shape=(10,)),
CustomLayer(10, name='custom_layer'),
tf.keras.layers.Dense(1, activation='sigmoid', name='output_layer')
])
model.save('model.h5')
model = tf.keras.models.load_model('model.h5')
【问题讨论】:
-
是的,我看到了,我按照它说的做了,对吧?我已经实现了
get_config和from_config函数。但他们从不保存整个模型,他们总是只是在减轻重量的情况下侥幸成功。 -
@AnimeshSinha,可以通过将
model = tf.keras.models.load_model('model.h5')替换为tf.keras.models.load_model('model.h5', custom_objects={'CustomLayer': CustomLayer})来解决该错误。但是,它会导致其他错误。您的 Google Colab 无法访问。您能否提供对它的访问权限,以便我可以帮助您。谢谢! -
抱歉@TensorflowWarriors,修复了链接。我会尝试自定义对象的想法。
-
@AnimeshSinha,您能否确认使用
Custom Objects是否解决了您的问题。
标签: python tensorflow keras save