Я тренирую сверточный автоэнкодер, и у меня возникают проблемы с уменьшением потерь, и я надеялся, что кто-то может указать на некоторые возможные улучшения.
У меня есть изображения в оттенках серого 1024x1024 (я пробовал то же самоес 512x512 тоже) и я надеюсь сжать их для неконтролируемой кластеризации.Моя полная модель приведена ниже, но она следует довольно простому шаблону из нескольких слоев Conv2D с максимальным пулом, за которым следует плотный слой, затем изменяет форму и слои Conv2D обратно до исходного размера изображения.
Некоторые вещи, которые я до сих пор пробовал:
1) Я обнаружил, что mse работает лучше как функция потерь, чем двоичная кросс-энтропия, потому что значения яркости пикселей очень далеки от равномерного распределения (двоичная перекрестная энтропия застревает, присваивая все значение 1, что имеет низкую ошибку, но бесполезно).
2) Я могу легко добиться очень низкой ошибки и почти идеального (на мой взгляд) изображенияреконструкция, если я просто избавлюсь от плотного слоя посередине и сожму изображение чуть меньше.Это довольно очевидно, но я предполагаю, что это показывает, что я не делаю какую-то ошибку, приводящую к бессмысленным выводам.
3) Моя потеря на самом деле не опускается ниже 0,02-0,03.Тем не менее, при 0,025 или около того изображение восстанавливается настолько, что становится очевидным, что выход исходит от входа, а не какой-то случайный шум (например, делает каждый пиксель одинаковой интенсивности или что-то в этом роде).Я думаю, что получить его ниже 0,01 будет достаточно, чтобы я мог кластеризоваться на.Мой самый низкий показатель (хотя и в немного более простом подмножестве моих данных) был 0,018, и я мог видеть четкую кластеризацию в выборках, когда наносил свои закодированные значения на тепловую карту.
4) Я получал много умирающих ReLU, когда мойсредний плотный слой использует активацию ReLU, что делает его менее полезным для возможной кластеризации.Вместо этого я использую tanh.Я также обнаружил, что «he_normal» лучше работает как инициализация для плотного слоя.
5) Добавление более плотных слоев в середине, кажется, не помогает вообще.
6) Реверсированиеформа кодера (так что он идет от меньшего количества ядер на слой к большему количеству ядер) также не помогает, хотя я знаю, что традиционно так выглядит сверточный автоэнкодер.
Вот полная модель (вывод из модели.summary ()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_4 (InputLayer) (None, 1024, 1024, 1) 0
_________________________________________________________________
conv2d_40 (Conv2D) (None, 1024, 1024, 128) 1280
_________________________________________________________________
max_pooling2d_19 (MaxPooling (None, 512, 512, 128) 0
_________________________________________________________________
batch_normalization_4 (Batch (None, 512, 512, 128) 512
_________________________________________________________________
conv2d_41 (Conv2D) (None, 512, 512, 64) 73792
_________________________________________________________________
max_pooling2d_20 (MaxPooling (None, 256, 256, 64) 0
_________________________________________________________________
conv2d_42 (Conv2D) (None, 256, 256, 32) 18464
_________________________________________________________________
max_pooling2d_21 (MaxPooling (None, 128, 128, 32) 0
_________________________________________________________________
conv2d_43 (Conv2D) (None, 128, 128, 16) 4624
_________________________________________________________________
max_pooling2d_22 (MaxPooling (None, 64, 64, 16) 0
_________________________________________________________________
conv2d_44 (Conv2D) (None, 64, 64, 8) 1160
_________________________________________________________________
max_pooling2d_23 (MaxPooling (None, 32, 32, 8) 0
_________________________________________________________________
flatten_4 (Flatten) (None, 8192) 0
_________________________________________________________________
dense_5 (Dense) (None, 512) 4194816
_________________________________________________________________
reshape_4 (Reshape) (None, 8, 8, 8) 0
_________________________________________________________________
up_sampling2d_22 (UpSampling (None, 16, 16, 8) 0
_________________________________________________________________
conv2d_45 (Conv2D) (None, 16, 16, 16) 1168
_________________________________________________________________
up_sampling2d_23 (UpSampling (None, 32, 32, 16) 0
_________________________________________________________________
conv2d_46 (Conv2D) (None, 32, 32, 16) 2320
_________________________________________________________________
up_sampling2d_24 (UpSampling (None, 64, 64, 16) 0
_________________________________________________________________
conv2d_47 (Conv2D) (None, 64, 64, 32) 4640
_________________________________________________________________
up_sampling2d_25 (UpSampling (None, 128, 128, 32) 0
_________________________________________________________________
conv2d_48 (Conv2D) (None, 128, 128, 64) 18496
_________________________________________________________________
up_sampling2d_26 (UpSampling (None, 256, 256, 64) 0
_________________________________________________________________
conv2d_49 (Conv2D) (None, 256, 256, 128) 73856
_________________________________________________________________
up_sampling2d_27 (UpSampling (None, 512, 512, 128) 0
_________________________________________________________________
conv2d_50 (Conv2D) (None, 512, 512, 128) 147584
_________________________________________________________________
up_sampling2d_28 (UpSampling (None, 1024, 1024, 128) 0
_________________________________________________________________
conv2d_51 (Conv2D) (None, 1024, 1024, 1) 1153
=================================================================
Total params: 4,543,865
Trainable params: 4,543,609
Non-trainable params: 256