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)
。