我遇到的问题类似于此处所述: ValueError: Unknown layer: Functional
import tensorflow as tf
model = tf.keras.models.load_model("model.h5")
它抛出:ValueError: Unknown layer: Functional
。
我非常确定这是因为h5文件已保存在TF 2.3.0中,而我正尝试在2.2.0中加载它。我宁愿不直接使用tf 2.3.0进行转换,而是希望找到一种手动修复h5py文件本身或将正确的自定义对象传递给模型加载器的方法。我注意到,无论配置文件存储在哪里,这似乎只是一个额外的键,例如https://github.com/tensorflow/tensorflow/issues/41929
问题是,我不确定如何手动摆脱h5文件中的Functional
层。具体来说,我已经尝试过:
import h5py
f = h5py.File("model.h5",'r')
print(f['model_weights'].keys())
给出:
<KeysViewHDF5 ['concatenate_1', 'conv1d_3', 'conv1d_4', 'conv1d_5', 'dense_1', 'dropout_4', 'dropout_5', 'dropout_6', 'dropout_7', 'embedding_1', 'global_average_pooling1d_1', 'global_max_pooling1d_1', 'input_2']>
,我在任何地方都看不到Functional
层。该文件中存储的模型配置到底在哪里?例如。我正在寻找类似{"class_name": "Functional", "config": {"name": "model", "layers":...}}
问题:有没有办法我可以使用h5py
手动编辑h5文件来摆脱功能层?
或者,我可以将特定的custom_obects={'Functiona':???}
传递给load_model
函数吗?
我尝试过{'Functional':tf.keras.models.Model}
,但返回了('Keyword argument not understood:', 'groups')
,因为我认为它正在尝试将模型加载到权重中?
答案 0 :(得分:0)
我有类似的问题。我无需更改Tensorflow版本和重新训练模型即可解决此问题的唯一方法是,使用TensorFlow 2.2.0中的Keras API再次构建模型结构,然后调用:
model.load_weights(<h5 file>)
使用TensorFlow 2.3.0创建原始h5文件的位置。如果您已经具有构建模型结构的代码,则此方法应该相对简单,因为您要做的就是用上面的行替换load_model(<h5 file>)
。
答案 1 :(得分:-1)
只是改变
keras.models import load_model
tensorflow.keras.models import load_model
然后
load_model('model.h5', compile = False)