Comments 4
Вы эту реализацию U-net сами написали или взяли откуда-то? Есть некоторые вопросы:
x = Conv2D(filters,
size,
strides=strides,
padding=padding)(x)
x = BatchNormalization()(x)
Почему в свёртке не указано use_bias = False? По-идее он бесполезным будет, если сразу после неё используется нормализация. Или оно вообще не влияет на результат и производительность, и проще не писать лишнюю строчку?
Зачем после макс-пулинга используется dropout? Разве батч-нормализации недостаточно? От него в данном случае есть какой-нибудь ощутимый эффект? Зачем у dropout разный rate на разных мастштабах? Из каких соображений это получается?
И ещё — в каждом residual блоке выход после последней свёртки нормализуется. Из-за этого получается, что каждый блок делает примерно одинаковый вклад, даже если, например, предыдущие слои уже всё распознали и вклад от текущего блока не особо нужен. Не получится ли, что без нормализации в конце каждого блока сеть обучится лучше?
deconv4 = Conv2DTranspose(start_neurons * 8, (3, 3),
strides=(2, 2),
padding="same")(convm)
Почему для увеличения используется транспонированная свёртка с ядром 3*3? Будет же проблема с шахматным рисунком.
Просто в оригинальной статье нет ни слова про dropout, батч-нормализацию, residual-блоки, а для увеличения используется "up-convolution 2x2".
Общей идеей архитектура вроде бы похожа на U-net, но, как мне кажется, стоило хотябы упомянуть отличия — а лучше объяснить, почему сделанно именно таким образом, хотя бы на уровне "батч-нормализация точно нужна" или "dropout просто потому что так захотелось".
На реальных данных очень долго считать, на тех же корабликах 10 суток заняла тренировка.
Шпаргалка для искусственного интеллекта — выбрось лишнее, учи главному. Техника обработки обучающих последовательностей