Не всегда бывает так, что размеры фильтров уменьшаются или увеличиваются с увеличением количества слоев в кодере. В большинстве примеров кодера, которые я видел в сверточных архитектурах автоэнкодера, высота и ширина уменьшаются за счет пошаговой свертки или объединения, а глубина слоя увеличивается (размеры фильтров увеличиваются), сохраняется аналогично предыдущему или изменяется с каждым новым слоем в кодере. Но есть также примеры, когда выходные каналы или размеры фильтров уменьшаются с увеличением количества слоев.
Обычно автоэнкодер кодирует входные данные в скрытое представление/вектор или вложение, которое имеет меньший размер, чем входные данные, что сводит к минимуму ошибку восстановления. Таким образом, оба вышеперечисленных метода могут быть использованы для создания неполного автоэнкодера путем изменения размера ядра, количества слоев, добавления дополнительного слоя в конце кодера с определенным размером и т.д.
Пример увеличения фильтра
На изображении ниже по мере добавления большего количества слоев в кодере размеры фильтров увеличиваются. Но в качестве входных данных 28*28*1 = 784
размерные объекты и сглаженное представление 3*3*128 = 1152
более того, перед последним слоем добавляется еще один слой, который является слоем встраивания. Это уменьшает размер объекта с заранее определенным количеством выходов в полностью подключенной сети. Даже последний плотный/полностью подключенный слой может быть заменен изменением количества слоев или размера ядра для вывода (1, 1, NUM_FILTERS)
.
Пример уменьшения фильтра
Простой пример уменьшения фильтров в кодере по мере увеличения количества слоев можно найти на примере сверточного автоэнкодера keras, как и в вашем коде.
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)
Рекомендации