有没有办法定义具有不同输入、输出形状的自动编码器?

Is there a way to define an auto-encoder with different input, output shapes?

我见过的所有自动编码器都具有相同的输入输出形状。但是,我需要一个自动编码器,其输入形状为 (None, 32, 16, 3) [RGB 图像],输出形状为 (None, 16, 16, 6) [图像的单热编码表示]。我已尝试将 Keras 示例用于 mnist 数据集并针对我的用例进行调整,但出现以下错误:

ValueError: `logits` and `labels` must have the same shape, received ((None, 32, 16, 6) vs (None, 16, 16, 6)).

下面是我的自动编码器架构:

input = layers.Input(shape=(32, 16, 3))

# Encoder
x = layers.Conv2D(32, (3, 3), activation="relu", padding="same")(input)
x = layers.MaxPooling2D((2, 2), padding="same")(x)
x = layers.Conv2D(32, (3, 3), activation="relu", padding="same")(x)
x = layers.MaxPooling2D((2, 2), padding="same")(x)

# Decoder
x = layers.Conv2DTranspose(32, (3, 3), strides=2, activation="relu", padding="same")(x)
x = layers.Conv2DTranspose(32, (3, 3), strides=2, activation="relu", padding="same")(x)
x = layers.Conv2D(6, (3, 3), activation="softmax", padding="same")(x)

# Autoencoder
autoencoder = Model(input, x)
autoencoder.compile(opti
mizer="adam", loss="binary_crossentropy")
autoencoder.summary()

我现在关心的是让它正常工作而不会导致错误,然后我会继续修复其他东西,比如损失函数等。有什么办法可以让它工作,还是我应该去对于其他深度学习架构?

从理论上讲,您可以完全按照您描述的方式构建模型,并最终得到与输入不同的输出形状。 在这种情况下,您只需考虑到您的输入数据也不适合作为训练目标。在这种情况下,目标必须是与网络输出具有相同形状的数据。

根据错误信息,这里不是这样的。该模型的输出形状为 (None, 32, 16, 6)。但是,目标是形状为 (None, 16, 16, 6).

的数据

要解决这个问题,必须调整网络或其层,使两个形状相互适合。 通过 autoencoder.summary() 的输出,你可以很好地看到最后的形状。 例如,具有正确输出形状的可能网络如下所示:

input = layers.Input(shape=(32, 16, 3))
# Encoder
x = layers.Conv2D(32, (3, 3), 
activation="relu", padding="same")(input)
x = layers.MaxPooling2D((2, 2), padding="same")(x)
x = layers.Conv2D(32, (3, 3), activation="relu", padding="same")(x)
x = layers.MaxPooling2D((4, 2), padding="same")(x)

# Decoder
x = layers.Conv2DTranspose(32, (3, 3), strides=2, activation="relu", padding="same")(x)
x = layers.Conv2DTranspose(32, (3, 3), strides=2, activation="relu", padding="same")(x)
x = layers.Conv2D(6, (3, 3), activation="softmax", padding="same")(x)

# Autoencoder
autoencoder = Model(input, x)

autoencoder.summary()