Эта UNet
архитектура, которую вы предоставили, не поддерживает эту форму (если параметр глубины <= 3). В конечном итоге причина этого заключается в том, что размер операции понижающей дискретизации не является обратимым, поскольку несколько входных фигур отображаются на одну и ту же выходную форму. Например, рассмотрим </p>
>> torch.nn.functional.max_pool2d(torch.zeros(1, 1, 10, 10), 2).shape
torch.Size([1, 1, 5, 5])
>> torch.nn.functional.max_pool2d(torch.zeros(1, 1, 11, 11), 2).shape
torch.Size([1, 1, 5, 5])
Итак, вопрос в том, что, учитывая, что выходной формат равен 5x5, какой был входной формат? Это было 10х10 или 11х11? Это же явление применимо к понижающей дискретизации с помощью пошаговых сверток.
Проблема заключается в том, что класс UNet
пытается объединить функции от половины понижающей дискретизации до сети с функциями в половине увеличенной выборки. Если он «угадывает» исходную форму во время повышающей дискретизации, вы получите ошибку несоответствия размеров.
Чтобы избежать этой проблемы, вам нужно убедиться, что высота и ширина ваших входных данных кратны 2**(depth-1)
. Таким образом, для значения по умолчанию depth=5
необходимо, чтобы высота и ширина входного изображения были кратны 16 (например, 560 или 576). В качестве альтернативы, поскольку 572 делится на 4, вы также можете установить depth=3
, чтобы он работал.