CNN 的自动编码器 - 减少或增加过滤器?

Autoencoder of CNN - decrease or increase filters?

在基于 CNN 的自动编码器中,您会增加还是减少层间过滤器的数量?当我们压缩信息时,我正在考虑减少。

这里是编码器部分的示例,其中每个新层的滤波器数量都从 16 减少到 8 再到 4。

x = Conv2D(filters = 16, kernel_size = 3, activation='relu', padding='same', name='encoder_1a')(inputs)
x = MaxPooling2D(pool_size = (2, 2), padding='same', name='encoder_1b')(x)

x = Conv2D(filters = 8, kernel_size = 3, activation='relu', padding='same', name='encoder_2a')(x)
x = MaxPooling2D(pool_size = (2, 2), padding='same', name='encoder_2b')(x)

x = Conv2D(filters = 4, kernel_size = 3, activation='relu', padding='same', name='encoder_3a')(x)
x = MaxPooling2D(pool_size = (2, 2), padding='same', name='encoder_3b')(x)

随着编码器中层数的增加,滤波器大小并不总是会减小或增大。在我见过的大多数卷积自动编码器架构的编码器示例中,高度和宽度通过跨步卷积或池化减少,层深度增加(过滤器大小增加),与上一层保持相似或随着编码器中的每个新层而变化.但也有输出通道或滤波器尺寸随着层数增加而减小的示例。

通常自动编码器将输入编码为潜在 representation/vector 或嵌入,其维度低于输入,从而最大限度地减少重建错误。因此,以上两者都可用于通过改变内核大小、层数、在具有特定维度的编码器末尾添加额外层等来创建 undercomplete autoencoder

过滤器增加示例

在下图中,随着在编码器中添加更多层,滤波器大小增加。但是由于输入 28*28*1 = 784 维特征和扁平表示 3*3*128 = 1152 更多,因此在最后一层之前添加了另一层,即嵌入层。它在完全连接的网络中使用预定义的输出数量减少了特征维度。即使是最后一个 dense/fully 连接层也可以通过改变层数或内核大小来替换以获得输出 (1, 1, NUM_FILTERS).

过滤减少示例

一个简单的例子,随着层数的增加,编码器中的过滤器减少,可以在 keras convolutional autoencoder 示例中找到,就像您的代码一样。

import keras
from keras import layers

input_img = keras.Input(shape=(28, 28, 1))

x = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = layers.MaxPooling2D((2, 2), padding='same')(x)

参考资料