【问题标题】:Changing decoder output shape in convolutional autoencoder for training更改卷积自动编码器中的解码器输出形状以进行训练
【发布时间】:2020-05-17 10:42:36
【问题描述】:

我正在尝试为卷积自动编码器模型训练我的数据集。我已经修补了 500,400x400x1 数据集。我的模型如下所示。

input_img = Input(shape = (400, 400, 1))

def encoder(input_img):
#encoder
conv1 = Conv2D(4, (3, 3), activation='relu', padding='same')(input_img) 
conv1 = BatchNormalization()(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
conv2 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool1)
conv2 = BatchNormalization()(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2) 
conv3 = Conv2D(16, (3, 3), activation='relu', padding='same')(pool2) 
conv3 = BatchNormalization()(conv3)
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)
conv4 = Conv2D(32, (3, 3), activation='relu', padding='same')(pool3)
conv4 = BatchNormalization()(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)
conv5 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool4)
conv5 = BatchNormalization()(conv5)
pool5 = MaxPooling2D(pool_size=(2, 2))(conv5)
conv6 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool5)
conv6 = BatchNormalization()(conv6)
pool6 = MaxPooling2D(pool_size=(2, 2))(conv6)
conv7 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool6) 
conv7 = BatchNormalization()(conv7)
pool7 = MaxPooling2D(pool_size=(2, 2))(conv7)
conv8 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool7)
conv8 = BatchNormalization()(conv8)
return conv8


def decoder(conv8):    
#decoder
conv9 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv8) 
conv9 = BatchNormalization()(conv9)
up1 = UpSampling2D((2,2))(conv9) 
conv12 = Conv2D(256, (3, 3), activation='relu', padding='same')(up1)
conv12 = BatchNormalization()(conv12)
up2 = UpSampling2D((2,2))(conv12) 
conv13 = Conv2D(128, (3, 3), activation='relu', padding='same')(up2) 
conv13 = BatchNormalization()(conv13)
up3 = UpSampling2D((2,2))(conv13) 
conv14 = Conv2D(64, (3, 3), activation='relu', padding='same')(up3)
conv14 = BatchNormalization()(conv14)
up4 = UpSampling2D((2,2))(conv14) 
conv15 = Conv2D(32, (3, 3), activation='relu', padding='same')(up4)
conv15 = BatchNormalization()(conv15)
up5 = UpSampling2D((2,2))(conv15) 
conv16 = Conv2D(16, (3, 3), activation='relu', padding='same')(up5)
conv16 = BatchNormalization()(conv16)
up6 = UpSampling2D((2,2))(conv16) 
conv17 = Conv2D(8, (3, 3), activation='relu', padding='same')(up6) 
conv17 = BatchNormalization()(conv17)
up7 = UpSampling2D((2,2))(conv17) 
conv18 = Conv2D(4, (3, 3), activation='relu', padding='same')(up7) 
conv18 = BatchNormalization()(conv18)
decoded = Conv2D(1, (3,3), activation='relu', padding='same')(conv18)
return decoded

在编码器处理之后,形状变为 (3,3,512)。但是当解码器过程完成时,形状会上升到 (384,384,1)。而且因为我的输入形状是 (400,400,1),所以我无法训练模型。是否有任何上采样方法可以将我的解码器 (384,384,1) 层更改为 (400,400,1)?

【问题讨论】:

    标签: python keras conv-neural-network autoencoder


    【解决方案1】:

    您可以增加中间 Con2D 层中的填充以弥补 16 个像素。请参阅this documentation 了解如何控制二维填充。

    你也可以使用明确的padding layers

    【讨论】:

    • 首先感谢您的关注。我可以在 Keras 中更改填充吗?此外,当我将填充更改为元组或 int 'tuple' object has no attribute 'lower' 时会出现错误。
    • 啊,是的,这是 PyTorch 文档,如果问题是 keras 特定的,请在问题中添加 keras 标签,它可以帮助您找到正确的答案。但可以肯定的是,在 keras/TensorFlow 中必须有一个等效的填充
    猜你喜欢
    • 1970-01-01
    • 2020-02-06
    • 2021-10-06
    • 2017-01-04
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    相关资源
    最近更新 更多