Tensorflow 2.3.0-> 2.2.0可比性:ValueError:未知层:功能

时间:2020-08-25 22:28:26

标签: tensorflow keras

我遇到的问题类似于此处所述: 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'),因为我认为它正在尝试将模型加载到权重中?

2 个答案:

答案 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)