Python 从保存的自动编码器中提取编码器和解码器

Python 从保存的自动编码器中提取编码器和解码器,python,keras,autoencoder,Python,Keras,Autoencoder,我保存了大量用于我的项目的自动编码器的模型。它们是使用autoencoder.save(outdir+“autoencoder”+参数)功能保存的 是否有任何方法可以提取每个已保存模型的编码器和解码器组件,或者需要重新运行脚本并添加encoder=Model(输入,瓶颈)和decoder=Model(瓶颈,输出)行并保存这些模型 以下是我试图检索的自动编码器结构: autoencoder.summary() Model: "model_3" ________________

我保存了大量用于我的项目的自动编码器的模型。它们是使用
autoencoder.save(outdir+“autoencoder”+参数)
功能保存的

是否有任何方法可以提取每个已保存模型的编码器和解码器组件,或者需要重新运行脚本并添加
encoder=Model(输入,瓶颈)
decoder=Model(瓶颈,输出)
行并保存这些模型

以下是我试图检索的自动编码器结构:

autoencoder.summary()

Model: "model_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 3593, 4)]         0         
_________________________________________________________________
flatten (Flatten)            (None, 14372)             0         
_________________________________________________________________
dense (Dense)                (None, 1797)              25828281  
_________________________________________________________________
dense_1 (Dense)              (None, 719)               1292762   
_________________________________________________________________
dense_2 (Dense)              (None, 180)               129600    
_________________________________________________________________
dense_3 (Dense)              (None, 719)               130139    
_________________________________________________________________
dense_4 (Dense)              (None, 1797)              1293840   
_________________________________________________________________
dense_5 (Dense)              (None, 14372)             25840856  
_________________________________________________________________
reshape (Reshape)            multiple                  0         
=================================================================
Total params: 54,515,478
Trainable params: 54,515,478
Non-trainable params: 0
_________________________________________________________________

您可以将权重传递到两个不同的神经网络模型。您只需识别瓶颈层的索引,通过运行
model.summary()

下面是一个可以帮助您复制模型的代码段

瓶颈索引=#您需要识别它
编码器_model=tf.keras.Sequential()
对于ae_模型中的层。层[:瓶颈_索引]:
layer_config=layer.get_config()#获取所有层的参数(单位、激活等)
复制了_layer=type(layer).from_config(layer_config)#以使用相同的参数初始化相同的层类
复制_layer.build(layer.input _shape)#构建层以初始化权重。
复制的_层。设置_权重(层。获取_权重())#传输可训练参数
编码器_模型。添加(复制的_层)#将其添加到编码器模型
对解码器执行相同的操作,其中
ae\u model.layers[瓶颈索引:


当然,如果瓶颈索引小于连续层,您甚至可以通过检查当前层的单位来识别瓶颈索引。

这会给复制的\u层的行带来一个错误。set\u weights(layer.get\u weights()):ValueError:您在“稠密\u 2”层上调用了“set\u weights(weights)”,权重列表长度为2,但是该层期望0个权重。这很奇怪,它可能会失败,因为该层没有初始化权重,我已经更新了我的代码以在传输权重之前构建层,你能试试吗?检查行:
copied\u layer.build(layer.input\u shape)
确实解决了这个问题,但现在它正在努力重塑层。我在问题中添加了摘要,似乎会有所帮助。下面是错误消息:AttributeError:layer“Reformate”具有多个入站节点,具有不同的输入形状。因此,该层的“输入形状”概念定义不正确。请改用
get\u input\u shape\u at(node\u index)