Высокие потери от сверточного автоэнкодера керас - PullRequest
1 голос
/ 25 сентября 2019

Я тренирую сверточный автоэнкодер, и у меня возникают проблемы с уменьшением потерь, и я надеялся, что кто-то может указать на некоторые возможные улучшения.

У меня есть изображения в оттенках серого 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...