我遇到了一个类似于这里描述的问题:ValueError:未知层:功能
import tensorflow as tf
model = tf.keras.models.load_model("model.h5")
其抛出:CCD_ 1。
我很确定这是因为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']>
并且我在任何地方都看不到CCD_ 3层。该文件中存储的模型的配置究竟在哪里?例如,我正在寻找类似{"class_name": "Functional", "config": {"name": "model", "layers":...}}
的东西
问题:有没有一种方法可以使用h5py
手动编辑h5文件以摆脱功能层?
或者,我可以将特定的custom_obects={'Functiona':???}
传递给load_model
函数吗?我尝试过{'Functional':tf.keras.models.Model}
,但它返回('Keyword argument not understood:', 'groups')
,因为我认为它试图将模型加载到权重中?
我也遇到了类似的问题。在不改变Tensorflow版本和重新训练模型的情况下,我可以解决它的唯一方法是使用Tensorflow 2.2.0中的Keras API再次构建模型结构,然后调用:
ValueError: Unknown layer: Functional
0
其中原始h5文件是使用TensorFlow 2.3.0创建的。如果您已经有了构建模型结构的代码,那么这个方法应该相对简单,因为您所要做的就是用上面的行替换load_model(<h5 file>)
。
只需更改
keras.models import load_model
tensorflow.keras.models import load_model
然后
load_model('model.h5', compile = False)