首页 > 解决方案 > 从 Keras 中经过训练的自动编码器模型中获取解码器

问题描述

我正在训练一个深度自动编码器,将人脸映射到 128 维潜在空间,然后将它们解码回原始的 128x128x3 格式。

我希望在训练自动编码器之后,我能够以某种方式“切片”自动编码器的后半部分,即负责将潜在空间 (128,) 映射到图像空间 (128, 128, 3) 的解码器网络通过使用功能性 Keras API 和autoenc_model.get_layer()

以下是我的模型的相关层:

INPUT_SHAPE=(128,128,3)
input_img = Input(shape=INPUT_SHAPE, name='enc_input')

#1
x = Conv2D(64, (3, 3), padding='same', activation='relu')(input_img)
x = BatchNormalization()(x)

//Many Conv2D, BatchNormalization(), MaxPooling() layers
.
.
.

#Flatten
fc_input = Flatten(name='enc_output')(x)

y = Dropout(DROP_RATE)(fc_input)
y = Dense(128, activation='relu')(y)
y = Dropout(DROP_RATE)(y)
fc_output = Dense(128, activation='linear')(y)   

#Reshape
decoder_input = Reshape((8, 8, 2), name='decoder_input')(fc_output)

#Decoder part

#UnPooling-1
z = UpSampling2D()(decoder_input)
//Many Conv2D, BatchNormalization, UpSampling2D layers
.
.
.
#16
decoder_output = Conv2D(3, (3, 3), padding='same', activation='linear', name='decoder_output')(z)

autoenc_model = Model(input_img, decoder_output)

是包含整个模型架构的笔记本。

为了从训练有素的自动编码器中获取解码器网络,我尝试使用:

dec_model = Model(inputs=autoenc_model.get_layer('decoder_input').input, outputs=autoenc_model.get_layer('decoder_output').output)

dec_model = Model(autoenc_model.get_layer('decoder_input'), autoenc_model.get_layer('decoder_output'))

两者似乎都不起作用。

我需要从自动编码器中提取解码器层,因为我想先训练整个自动编码器模型,然后独立使用编码器和解码器。

我在其他任何地方都找不到满意的答案。关于构建自动编码器的Keras博客文章仅介绍了如何为 2 层自动编码器提取解码器。

解码器输入/输出形状应为:(128, ) 和 (128, 128, 3),分别是“decoder_input”的输入形状和“decoder_output”层的输出形状。

标签: pythonkerasneural-networkautoencoder

解决方案


需要进行一些更改:

z = UpSampling2D()(decoder_input)

direct_input = Input(shape=(8,8,2), name='d_input')
#UnPooling-1
z = UpSampling2D()(direct_input)

autoenc_model = Model(input_img, decoder_output)

dec_model = Model(direct_input, decoder_output)
autoenc_model = Model(input_img, dec_model(decoder_input))

现在,您可以在自动编码器上进行训练并使用解码器进行预测。

import numpy as np
autoenc_model.fit(np.ones((5,128,128,3)), np.ones((5,128,128,3)))
dec_model.predict(np.ones((1,8,8,2)))

您还可以参考这个独立的示例: https ://github.com/keras-team/keras/blob/master/examples/variational_autoencoder.py


推荐阅读