有什么方法可以从 Keras 中的自动编码器获取任何层的特征吗?
Is there any way to obtain features of any layer from autoencoder in Keras?
大家好,我正在使用自动编码器,我正在尝试从自动编码器的特定层获取特征(我对潜在 space 不感兴趣)。我正在使用以下代码:
#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 编码器部分的第三层的输出。有什么想法吗?
谢谢!!!
在顺序模型中,您可以通过 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])
大家好,我正在使用自动编码器,我正在尝试从自动编码器的特定层获取特征(我对潜在 space 不感兴趣)。我正在使用以下代码:
#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 编码器部分的第三层的输出。有什么想法吗?
谢谢!!!
在顺序模型中,您可以通过 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])