tensorflow - 如何在使用 Residual Skip Connections(基于 ResNet 的自动编码器)的 Keras(tensorflow.keras)中构建自动编码器/U-Net?
问题描述
我构建并测试了 2 个不同的模型,它们可以给我Bottleneck Features/Hidden Embeddings
,但它们并没有给我很好的结果。我的想法是训练一个可以根据我的任务找到“UseFul”嵌入的网络。这个想法是
- 训练一个自动编码器/U-Net,以便它可以通过重建
Grayscale
图像来学习有用的表示(占总图像的一些百分比。假设它是预训练任务)。 - 仅从该架构中剥离嵌入模型,并在此
Siamese
基础上构建一个网络,以进一步将权重推向我的任务。 - 获取经过训练的
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 编码器模型,但解码器,我无法获得。
解决方案
推荐阅读
- mysql - MySQL批量用空格替换字符
- html - 使结构深处的 DIV 元素可滚动
- reactjs - 如何在 React 中存储输入字段中的值?
- python - 认知中过滤器的可变格式
- javascript - 覆盖类属性的 toString() - javascript
- java - 错误:尝试解析字符串日期时,无法在索引 0 处解析文本“1/31/2020”
- scala - scala java.time.ZonedDateTime.now 时区错误
- arrays - 更新/添加属性到 T-SQL 中的 json 数组
- c++ - 未读取类原型
- android - 即使在底层服务停止后也保持前台服务的通知