首页 文章

如何拆分卷积自动编码器?

提问于
浏览
3

我已经编译了一个自动编码器(下面是完整的代码),在训练之后我想将它分成两个独立的模型:编码器(层e1 ...编码)和解码器(所有其他层),在其中提供手动修改的图像已由解码器编码 . 我成功地创建了一个编码器作为一个单独的模型:

encoder = Model(input_img, autoencoder.layers[6].output)

但是当我尝试制作解码器时,同样的方法失败了:

encoded_input = Input(shape=(4,4,8))
decoder = Model(input_img, decoded)

这是我的完整代码:

from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D
from keras.models import Model
from keras import backend as K
from keras.models import load_model

input_img = Input(shape=(28, 28, 1))  # adapt this if using channels_first` image data format

e1 = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
e2 = MaxPooling2D((2, 2), padding='same')(e1)
e3 = Conv2D(8, (3, 3), activation='relu', padding='same')(e2)
e4 = MaxPooling2D((2, 2), padding='same')(e3)
e5 = Conv2D(8, (3, 3), activation='relu', padding='same')(e4)
encoded = MaxPooling2D((2, 2), padding='same')(e5)

# at this point the representation is (4, 4, 8) i.e. 128-dimensional

d1 = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
d2 = UpSampling2D((2, 2))(d1)
d3 = Conv2D(8, (3, 3), activation='relu', padding='same')(d2)
d4 = UpSampling2D((2, 2))(d3)
d5 = Conv2D(16, (3, 3), activation='relu')(d4)
d6 = UpSampling2D((2, 2))(d5)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(d6)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

请帮助 .

EDIT 顺便说一下,我能够用一个由密集层组成的自动编码器来做到这一点:

from keras.layers import Input, Dense
from keras.models import Model

# this is the size of our encoded representations
encoding_dim = 32  # 32 floats -> compression of factor 24.5, assuming     the input is 784 floats

# this is our input placeholder
input_img = Input(shape=(784,))

# "encoded" is the encoded representation of the input
encoded = Dense(encoding_dim, activation='relu')(input_img)

# "decoded" is the lossy reconstruction of the input
decoded = Dense(784, activation='sigmoid')(encoded)

# this model maps an input to its reconstruction
autoencoder = Model(input_img, decoded)

# this model maps an input to its encoded representation
encoder = Model(input_img, encoded)

# create a placeholder for an encoded (32-dimensional) input
encoded_input = Input(shape=(encoding_dim,))

# retrieve the last layer of the autoencoder model
decoder_layer = autoencoder.layers[-1]

# create the decoder model
decoder = Model(encoded_input, decoder_layer(encoded_input))

1 回答

  • 3

    好的,几个小时后我才知道这件事 . 对我有用的是:1 . 为编码器创建一个单独的模型2.为解码器创建一个单独的模型3.为自动编码器创建一个通用模型:

    autoencoder = Model(input, Decoder()(Encoder(input))
    

    完整的工作代码如下:

    def Encoder():
        input_img = Input(shape=(28, 28, 1))  # adapt this if using `channels_first` image data format   
        e1 = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
        e2 = MaxPooling2D((2, 2), padding='same')(e1)
        e3 = Conv2D(8, (3, 3), activation='relu', padding='same')(e2)
        e4 = MaxPooling2D((2, 2), padding='same')(e3)
        e5 = Conv2D(8, (3, 3), activation='relu', padding='same')(e4)
        e6 = MaxPooling2D((2, 2), padding='same')(e5)
        return Model(input_img, e6)
    
    
    def Decoder():
        input_img = Input(shape=(4, 4, 8))  # adapt this if using `channels_first` image data format   
        d1 = Conv2D(8, (3, 3), activation='relu', padding='same')(input_img)
        d2 = UpSampling2D((2, 2))(d1)
        d3 = Conv2D(8, (3, 3), activation='relu', padding='same')(d2)
        d4 = UpSampling2D((2, 2))(d3)
        d5 = Conv2D(16, (3, 3), activation='relu')(d4)
        d6 = UpSampling2D((2, 2))(d5)
        d7 = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(d6)
        return Model(input_img, d7)
    
    
    # define input to the model:
    x = Input(shape=(28, 28, 1))
    
    # make the model:
    autoencoder = Model(x, Decoder()(Encoder()(x)))
    
    # compile the model:
    autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
    

相关问题