【问题标题】:Stacking fully connected layers on top of two autoencoders for classification在两个自动编码器之上堆叠全连接层以进行分类
【发布时间】:2019-08-09 12:05:27
【问题描述】:

我正在使用卷积层在 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() 方法,以便第一个自动编码器使用第一组图像,第二个自动编码器使用第二组图像?

【问题讨论】:

    标签: keras neural-network deep-learning autoencoder keras-2


    【解决方案1】:

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

    答:你可以concatenatefc 内的两个自动编码器的瓶颈层 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 方法,以便第一个自动编码器使用第一组图像,第二个自动编码器使用第二组图像?

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

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

    注意:未经测试。

    【讨论】:

    • 谢谢,我试试看。您是否知道默认情况下 full_model 中的所有层是否都设置为可训练?
    • 不客气。是的,默认情况下它们都是可训练的。
    • 顺便说一下,假设我有两个潜在维度为 16 的自动编码器(即 16 维向量),即全连接网络的输入将是 32 维。我总共有大约 1000 个标签和两个类。你会选择从多少层全连接网络开始,每层有多少个节点?如果我使用多个层,节点的数量应该从一层到下一层增加还是减少(例如,两个的倍数)?
    • 这很难说,这真的取决于问题。我会使用验证集调整所有这些超参数
    • 好的,谢谢。这种全连接网络的通常布局是什么?这意味着每层的节点数量是增加还是减少(例如,增加或减少两倍)还是从层到层保持不变?我认为在使用验证集(例如节点数、层数)进行调整时,我需要知道一定范围的参数。
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2017-09-18
    • 2016-04-30
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2018-08-24
    相关资源
    最近更新 更多