在两个自动编码器之上堆叠完全连接的层以进行分类

Stacking fully connected layers on top of two autoencoders for classification

我正在使用卷积层在 2D 图像上训练自动编码器,并希望将完全连接的层放在编码器部分的顶部以进行分类。我的自动编码器定义如下(只是一个简单的说明):

def encoder(input_img):
    conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
    conv1 = BatchNormalization()(conv1)
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
    conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool1)
    conv2 = BatchNormalization()(conv2)
    return conv2

def decoder(conv2):    
    conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv2)
    conv3 = BatchNormalization()(conv3)
    up1 = UpSampling2D((2,2))(conv3)
    decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up1)
    return decoded

autoencoder = Model(input_img, decoder(encoder(input_img)))

我的输入图像大小为 (64,80,1)。现在,当在编码器顶部堆叠完全连接的层时,我正在执行以下操作:

def fc(enco):
    flat = Flatten()(enco)
    den = Dense(128, activation='relu')(flat)
    out = Dense(num_classes, activation='softmax')(den)
    return out

encode = encoder(input_img)
full_model = Model(input_img,fc(encode))
for l1,l2 in zip(full_model.layers[:19],autoencoder.layers[0:19]):
    l1.set_weights(l2.get_weights())

只有一个自动编码器有效,但现在的问题是我有 2 个自动编码器在所有大小(64、80、1)的图像集上训练。

对于每个标签,我都有两张大小为 (64, 80, 1) 的图像和一个标签(0 或 1)作为输入。我需要将图像 1 送入第一个自动编码器,将图像 2 送入第二个自动编码器。但是如何在上面的代码中 full_model 中组合两个自动编码器?

还有一个问题也是fit()方法的输入。到目前为止,只有一个自动编码器的输入仅包含 numpy 图像数组(例如 (1000,64,80,1)),但如果有两个自动编码器,我将有两组图像作为输入。我如何将其输入 fit() 方法,以便第一个自动编码器使用第一组图像,第二个自动编码器使用第二组图像?

问:如何在 full_model 中组合两个自动编码器?

A:您可以 concatenate fc:

中两个自动编码器的瓶颈层 enco_1enco_2
def fc(enco_1, enco_2):
    flat_1 = Flatten()(enco_1)
    flat_2 = Flatten()(enco_2)
    flat = Concatenate()([enco_1, enco_2])
    den = Dense(128, activation='relu')(flat)
    out = Dense(num_classes, activation='softmax')(den)
    return out

encode_1 = encoder_1(input_img_1)
encode_2 = encoder_2(input_img_2)

full_model = Model([input_img_1, input_img_2], fc(encode_1, encode_2))

请注意,您手动设置编码器权重的最后一部分是不必要的 - 请参阅 https://keras.io/getting-started/functional-api-guide/#shared-layers


问:如何将其输入 fit 方法,以便第一个自动编码器使用第一组图像,第二个自动编码器使用第二组图像?

A:在上面的代码中,请注意两个编码器的输入不同(每个图像集一个)。现在,假设模型是这样定义的,你可以调用 full_model.fit 如下:

full_model.fit(x=[images_set_1, images_set_2],
               y=label,
               ...)

注意:未测试。