Сводка Pytorch работает только для одного указанного c размера ввода для U-Net - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь реализовать архитектуру UNet в Pytorch. Когда я печатаю модель, используя print(model), я получаю правильную архитектуру:

enter image description here

, но когда я пытаюсь напечатать сводку, используя (или любой другой ввод размер для этого вопроса):

from torchsummary import summary
summary(model, input_size=(13, 572, 572))

Я получаю сообщение об ошибке:

RuntimeError: invalid argument 0: Sizes of tensors must match except in dimension 1. Got 70 and 71 in dimension 2 at /Users/distiller/project/conda/conda-bld/pytorch_1579022061893/work/aten/src/TH/generic/THTensor.cpp:612

error message

Однако, это работает отлично, если Я даю input_size как input_size=(3, 224, 224)) (как у этого человека здесь ). Я так озадачен.

Может кто-нибудь помочь мне, что случилось?

Редактировать : Я использовал архитектуру модели с здесь .

1 Ответ

1 голос
/ 14 февраля 2020

Эта 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, чтобы он работал.

...