有没有办法从 Keras 的自动编码器中获取任何层的特征? [复制]

Posted

技术标签:

【中文标题】有没有办法从 Keras 的自动编码器中获取任何层的特征? [复制]【英文标题】:Is there any way to obtain features of any layer from autoencoder in Keras? [duplicate] 【发布时间】:2021-09-11 05:18:38 【问题描述】:

大家好,我正在使用自动编码器,我正在尝试从自动编码器的特定层获取特征(我对潜在空间不感兴趣)。我正在使用以下代码:

#Define autoencoder
import keras 
input_shape  = (1, 512, 512, 1)
SIZE = 512


encoder = keras.models.Sequential()
encoder.add(keras.layers.Conv2D(32, (9, 9), activation='elu', padding='same', input_shape=(SIZE, SIZE, 1)))
encoder.add(keras.layers.BatchNormalization())


encoder.add(keras.layers.Conv2D(64, (7, 7), activation='elu', padding='same'))
encoder.add(keras.layers.BatchNormalization())


encoder.add(keras.layers.Conv2D(32, (5, 5), activation='elu', padding='same'))
encoder.add(keras.layers.MaxPooling2D((2, 2), padding='same'))
encoder.add(keras.layers.BatchNormalization())



encoder.add(keras.layers.Conv2D(32, (3, 3), activation='elu', padding='same'))
encoder.add(keras.layers.MaxPooling2D((2, 2), padding='same'))
encoder.add(keras.layers.BatchNormalization())


#Decoder
decoder = keras.models.Sequential()

decoder.add(keras.layers.Conv2D(32, (3, 3), activation='elu', padding='same'))
decoder.add(keras.layers.UpSampling2D((2, 2)))
decoder.add(keras.layers.BatchNormalization())


decoder.add(keras.layers.Conv2D(32, (5, 5), activation='elu', padding='same'))
decoder.add(keras.layers.UpSampling2D((2, 2)))
decoder.add(keras.layers.BatchNormalization())


decoder.add(keras.layers.Conv2D(64, (7, 7), activation='elu', padding='same'))
#decoder.add(keras.layers.UpSampling2D((2, 2)))
decoder.add(keras.layers.BatchNormalization())



decoder.add(keras.layers.Conv2D(32, (9,9), activation='elu', padding='same'))
#decoder.add(keras.layers.UpSampling2D((2, 2)))
decoder.add(keras.layers.BatchNormalization())



#decoder.add(keras.layers.Conv2D(64, (11,11), activation='elu', padding='same'))
#decoder.add(keras.layers.UpSampling2D((2, 2)))
#decoder.add(keras.layers.BatchNormalization())


decoder.add(keras.layers.Conv2D(1, (3, 3), activation='elu', padding='same'))

autoencoder = keras.models.Sequential([encoder,decoder])

autoencoder.compile(loss='mean_squared_error', optimizer = "adam")
autoencoder.summary()

最后,我训练自动编码器:

model_train = autoencoder.fit(X_train_noise, X_train,
        epochs=5000,
        shuffle=True)

现在,我需要输入一个新图像,但我只想要来自已定义 CNN 编码器部分的第三层的输出。有什么想法吗?

谢谢!!!

【问题讨论】:

这里已经被问了几百次了,问之前先搜索一下。 【参考方案1】:

在顺序模型中,您可以通过model.layers[index]model.get_layer(layer_name) 获得任何层输出。

以第三层输出为例:

features_for_third_layer = encoder.layers[2].output

features_for_third_layer = autoencoder.layers[0].layers[2].output

在训练自动编码器之后,如果您只想要任意层编码器的输出,并且想要输入图像并获得输出,一种简单的方法是定义另一个模型,如下所示:

new_model = keras.models.Model(inputs=encoder.input, outputs=encoder.layers[2].output)

然后,你可以得到这样的输出:

feature_vector = new_model.predict([image])

【讨论】:

以上是关于有没有办法从 Keras 的自动编码器中获取任何层的特征? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在密集的 Keras 层中绑定自动编码器权重

带有嵌入层的 Keras LSTM 自动编码器

用于 keras 中可变大小图像的全卷积自动编码器

如何从 Keras 嵌入层获取词向量

Keras:找出层数

如果我将层传递给两个 Keras 模型并且只训练一个模型,那么在前者训练后两个模型会共享权重吗