首页 > 解决方案 > 如何在使用 Residual Skip Connections(基于 ResNet 的自动编码器)的 Keras(tensorflow.keras)中构建自动编码器/U-Net?

问题描述

我构建并测试了 2 个不同的模型,它们可以给我Bottleneck Features/Hidden Embeddings,但它们并没有给我很好的结果。我的想法是训练一个可以根据我的任务找到“UseFul”嵌入的网络。这个想法是

  1. 训练一个自动编码器/U-Net,以便它可以通过重建Grayscale图像来学习有用的表示(占总图像的一些百分比。假设它是预训练任务)。
  2. 仅从该架构中剥离嵌入模型,并在此Siamese基础上构建一个网络,以进一步将权重推向我的任务。
  3. 获取经过训练的Siamese网络并从该网络中提取嵌入,以在我的向量空间中获取相似图像。

我使用了我的 2 个模型,但它开始过度拟合,随着层数的增加而增加了损失。ResNet会阻止的。

ReesNet对于第三点,我会直接使用一个简单的预训练模型,但我的图像是灰度的,它正在提取额外的信息。我使用Grayscale图像并自我复制 3 次以获得 3 通道图像,但仍然没有用。我想试试这个新模型。让我们说下面是非常简单的 U-Net Xception 风格模型架构的代码:来自 Keras 博客

from tensorflow.keras import layers


def get_model(img_size, num_classes):
    inputs = keras.Input(shape=img_size + (3,))

    ### [First half of the network: downsampling inputs] ###

    # Entry block
    x = layers.Conv2D(32, 3, strides=2, padding="same")(inputs)
    x = layers.BatchNormalization()(x)
    x = layers.Activation("relu")(x)

    previous_block_activation = x  # Set aside residual

    # Blocks 1, 2, 3 are identical apart from the feature depth.
    for filters in [64, 128, 256]:
        x = layers.Activation("relu")(x)
        x = layers.SeparableConv2D(filters, 3, padding="same")(x)
        x = layers.BatchNormalization()(x)

        x = layers.Activation("relu")(x)
        x = layers.SeparableConv2D(filters, 3, padding="same")(x)
        x = layers.BatchNormalization()(x)

        x = layers.MaxPooling2D(3, strides=2, padding="same")(x)

        # Project residual
        residual = layers.Conv2D(filters, 1, strides=2, padding="same")(
            previous_block_activation
        )
        x = layers.add([x, residual])  # Add back residual
        previous_block_activation = x  # Set aside next residual

    ### [Second half of the network: upsampling inputs] ###

    for filters in [256, 128, 64, 32]:
        x = layers.Activation("relu")(x)
        x = layers.Conv2DTranspose(filters, 3, padding="same")(x)
        x = layers.BatchNormalization()(x)

        x = layers.Activation("relu")(x)
        x = layers.Conv2DTranspose(filters, 3, padding="same")(x)
        x = layers.BatchNormalization()(x)

        x = layers.UpSampling2D(2)(x)

        # Project residual
        residual = layers.UpSampling2D(2)(previous_block_activation)
        residual = layers.Conv2D(filters, 1, padding="same")(residual)
        x = layers.add([x, residual])  # Add back residual
        previous_block_activation = x  # Set aside next residual

    # Add a per-pixel classification layer
    outputs = layers.Conv2D(num_classes, 3, activation="softmax", padding="same")(x)

    # Define the model
    model = keras.Model(inputs, outputs)
    return model

我想知道如何Resnet在这个模型中使用架构?我可以构建一个 Resnet 编码器模型,但解码器,我无法获得。

标签: tensorflowkerasdeep-learningconv-neural-networkautoencoder

解决方案


推荐阅读