Ele não é sempre o caso em que o filtro tamanhos são reduzidos ou aumentados com o aumento do número de camadas no encoder. Na maioria dos exemplos de encoder eu tenho visto de convolucionais autoencoder arquiteturas a altura e a largura é reduzida através strided de convolução ou agrupamento, e a profundidade da camada é maior (filtro tamanhos são aumentados), manteve semelhante para durar um ou variada, com cada nova camada no encoder. Mas há também exemplos em que os canais de saída ou filtro tamanhos são diminuídos com mais camadas.
Geralmente autoencoder codifica entrada em latente representação de vetores ou de incorporação que tenha menor dimensão do que a de entrada, que minimiza a reconstrução de erro. Assim, tanto o acima pode ser usado para a criação de undercomplete autoencoder pela variação do kernel do tamanho, número de camadas, adicionando uma camada extra no final do encoder com uma certa dimensão, etc.
Filtro de aumentar exemplo
Na imagem abaixo como mais camadas são adicionadas no encoder o filtro de aumento de tamanhos. Mas como a entrada 28*28*1 = 784
dimensão recursos e a representação plana 3*3*128 = 1152
é mais do que uma outra camada é adicionada antes da camada final que é a incorporação de camada. Ele reduz a funcionalidade de dimensão, com um número predefinido de saídas em rede totalmente conectada. Até o último densa/totalmente ligado a camada pode ser substituído pela variação do número de camadas de kernel ou de tamanho para ter uma saída (1, 1, NUM_FILTERS)
.
Filtro de redução exemplo
Um exemplo fácil de filtros diminuindo no codificador como o número de camadas de aumento pode ser encontrado no keras convolucionais autoencoder exemplo assim como seu código.
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)
Referências