Я строю U-сеть для проблемы сегментации изображений с двумя классами, используя Keras. Я свободно следую приведенному здесь примеру: https://github.com/zhixuhao/unet. Следуя этому примеру, последние несколько слоев декодера (включая выходной слой) выглядят так:
up9 = UpSampling2D(size = (2,2))(conv8)
merge9 = concatenate([conv1,up9], axis = 3)
conv9 = Conv2D(16, 3, activation = 'relu', padding = 'same')(merge9)
conv9 = Conv2D(16, 3, activation = 'relu', padding = 'same')(conv9)
conv9 = Conv2D(2, 3, activation = 'relu', padding = 'same')(conv9)
conv10 = Conv2D(1, 1, activation = 'sigmoid',padding='same')(conv9)
Основная проблема, которую я обнаружил, заключается в том, что при удалении этой строки:
conv9 = Conv2D(2, 3, activation = 'relu', padding = 'same')(conv9)
тогда U-сеть вообще не может тренироваться (используя бинарную кроссентропию), и я не могу понять, почему этот слой необходим, учитывая, что я видел почти идентичные U-сети в других местах, которые полностью пропускают этот слой.
Может ли кто-нибудь помочь пролить свет на то, почему этот слой необходим? Если бы я делал WAG, я бы сказал, что это как-то связано с тем, что мы хотим сократить до 2 фильтров для представления каждого класса? Это как-то связано с ожидаемой формой вывода (128x128x1) в этом случае?