【问题标题】:How can I further improve this model(autoencoder)?我怎样才能进一步改进这个模型(自动编码器)?
【发布时间】:2021-06-29 20:35:04
【问题描述】:

这是我第一次为图像聚类实现自动编码器,而且我是 CNN 的新手。 我试图了解它是如何工作的,并通过使用图像测试模型来学习。这是我的模型,我只是想知道我在这里做错了什么,或者您有什么建议可以改进这个模型。

input = Input((224, 224,3), name = 'input')

conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same')(input)
conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same')(conv1)
bn1 = BatchNormalization()(conv1)
pool_enc = MaxPooling2D(pool_size = (2,2), strides = (2,2))(bn1)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same')(bn1)
bn1 = BatchNormalization()(bn1)
pool1 = MaxPooling2D(pool_size = (2,2), strides = (2,2))(bn1)

#DECODER

pool1 = UpSampling2D((2,2))(pool1)
bn1 = BatchNormalization()(pool1)
bn1 = Conv2DTranspose(512, (3, 3), activation = 'relu', padding = 'same'')(bn1)
opt = Adam(lr=0.01)

model = Model(inputs = inputs, outputs = bn1, name = 'a-coder')

model.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])

【问题讨论】:

    标签: image-processing conv-neural-network autoencoder


    【解决方案1】:

    “改进”这个词非常模糊,因为您确实需要具体说明它目前存在哪些问题以及您将如何衡量“改进”。

    但我对你的代码做的第一件事是重新排列图层。

    将 CNN 层组合在一起的最佳方法是

    a CNN -> a Batch Normalization -> an activation (like relu)
    

    而你现在所做的就像

    a CNN -> a relu -> a CNN -> a relu -> a Batch Normalization
    

    这不太理想。

    编码器部分应该是这样的

    conv5_enc = Conv2D(512, (3, 3), padding = 'same', name ='conv5_1_enc')(pool4_enc)
    conv5_enc = BatchNormalization(name = "bn5_enc_1")(conv5_enc)
    conv5_enc = Activation('relu')(conv5_enc)
    conv5_enc = Conv2D(512, (3, 3), padding = 'same', name ='conv5_2_enc')(conv5_enc)
    conv5_enc = BatchNormalization(name = "bn5_enc_2")(conv5_enc)
    conv5_enc = Activation('relu')(conv5_enc)
    conv5_enc = Conv2D(512, (3, 3), padding = 'same', name ='conv5_3_enc')(conv5_enc)
    conv5_enc = BatchNormalization(name = "bn5_enc_3")(conv5_enc)
    conv5_enc = Activation('relu')(conv5_enc)
    

    解码器也是,在cnn之前使用batchnorm没有意义

    pool2_dec = UpSampling2D((2,2), name = 'pool_2')(conv3_dec)
    conv2_dec = Conv2DTranspose(128, (3, 3), padding = 'same', name ='conv2_2_dec')(pool2_dec)
    conv2_dec = BatchNormalization(name = "bn4_dec_1")(conv2_dec)
    conv2_dec = Activation('relu')(conv2_dec)
    conv2_dec = Conv2DTranspose(128, (3, 3), padding = 'same', name ='conv2_1_dec')(conv2_dec)
    conv2_dec = BatchNormalization(name = "bn4_dec_2")(conv2_dec)
    conv2_dec = Activation('relu')(conv2_dec)
    

    【讨论】:

    • 非常感谢。我错过了你提到的应该是conv+batch normalization+relu。你对解码器中的 bn 是正确的,因为没有解码器中的 bn 结果会更好,因为我错误地使用了 bn 但是这个模型link.springer.com/article/10.1007/s11277-018-5702-9/figures/4 在这种情况下他们不是在解码器中使用了 bn 和 relu 吗?
    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2021-10-01
    • 2020-02-07
    • 1970-01-01
    • 2018-02-08
    相关资源
    最近更新 更多