Делаем сверточные сети снова инвариантными к сдвигу
Ричард Чжан. В ICML, 2019.
Запустите pip install antialiased-cnns
import antialiased_cnns
model = antialiased_cnns . resnet50 ( pretrained = True )
Если у вас уже есть модель и вы хотите выполнить сглаживание и продолжить обучение, скопируйте старые веса:
import torchvision . models as models
old_model = models . resnet50 ( pretrained = True ) # old (aliased) model
antialiased_cnns . copy_params_buffers ( old_model , model ) # copy the weights over
Если вы хотите изменить свою собственную модель, используйте слой BlurPool. Более подробная информация о предоставленных нами моделях и о том, как использовать BlurPool, приведена ниже.
C = 10 # example feature channel size
blurpool = antialiased_cnns . BlurPool ( C , stride = 2 ) # BlurPool layer; use to downsample a feature map
ex_tens = torch . Tensor ( 1 , C , 128 , 128 )
print ( blurpool ( ex_tens ). shape ) # 1xCx64x64 tensor
Обновления
pip install antialiased-cnns
и загружать модели с флагом pretrained=True
.BlurPool
.Pip установить этот пакет
pip install antialiased-cnns
Или клонируйте этот репозиторий и установите требования (в частности, PyTorch).
https://github.com/adobe/antialiased-cnns.git
cd antialiased-cnns
pip install -r requirements.txt
Следующее загружает предварительно обученную сглаженную модель, возможно, в качестве основы для вашего приложения.
import antialiased_cnns
model = antialiased_cnns . resnet50 ( pretrained = True , filter_size = 4 )
Мы также предоставляем веса для сглаженных AlexNet
, VGG16(bn)
, Resnet18,34,50,101
, Densenet121
и MobileNetv2
(см. example_usage.py).
Модуль antialiased_cnns
содержит класс BlurPool
, который выполняет размытие+подвыборку. Запустите pip install antialiased-cnns
или скопируйте подкаталог antialiased_cnns
.
Методология Методология проста — сначала оцените с шагом 1, а затем используйте слой BlurPool
для понижения разрешения со сглаживанием. Внесите следующие архитектурные изменения.
import antialiased_cnns
# MaxPool --> MaxBlurPool
baseline = nn . MaxPool2d ( kernel_size = 2 , stride = 2 )
antialiased = [ nn . MaxPool2d ( kernel_size = 2 , stride = 1 ),
antialiased_cnns . BlurPool ( C , stride = 2 )]
# Conv --> ConvBlurPool
baseline = [ nn . Conv2d ( Cin , C , kernel_size = 3 , stride = 2 , padding = 1 ),
nn . ReLU ( inplace = True )]
antialiased = [ nn . Conv2d ( Cin , C , kernel_size = 3 , stride = 1 , padding = 1 ),
nn . ReLU ( inplace = True ),
antialiased_cnns . BlurPool ( C , stride = 2 )]
# AvgPool --> BlurPool
baseline = nn . AvgPool2d ( kernel_size = 2 , stride = 2 )
antialiased = antialiased_cnns . BlurPool ( C , stride = 2 )
Мы предполагаем, что входящий тензор имеет C
каналов. Вычисление слоя на шаге 1 вместо шага 2 увеличивает память и время выполнения. Таким образом, мы обычно пропускаем сглаживание при самом высоком разрешении (на ранних этапах работы в сети), чтобы предотвратить значительное увеличение.
Добавьте сглаживание и затем продолжите обучение. Если вы уже обучили модель, а затем добавили сглаживание, вы можете выполнить точную настройку на основе этой старой модели:
antialiased_cnns . copy_params_buffers ( old_model , antialiased_model )
Если это не сработает, вы можете просто скопировать параметры (а не буферы). Добавление сглаживания не добавляет никаких параметров, поэтому списки параметров идентичны. (Буферы добавляются, поэтому для сопоставления буферов используется некоторая эвристика, что может вызвать ошибку.)
antialiased_cnns . copy_params ( old_model , antialiased_model )
Мы наблюдаем улучшения как в точности (как часто изображение классифицируется правильно), так и в согласованности (как часто два смещения одного и того же изображения классифицируются одинаково).
ТОЧНОСТЬ | Базовый уровень | Сглаженный | Дельта |
---|---|---|---|
Алекснет | 56,55 | 56,94 | +0,39 |
vgg11 | 69.02 | 70,51 | +1,49 |
vgg13 | 69,93 | 71,52 | +1,59 |
vgg16 | 71,59 | 72,96 | +1,37 |
vgg19 | 72,38 | 73,54 | +1,16 |
vgg11_bn | 70,38 | 72,63 | +2,25 |
vgg13_bn | 71,55 | 73,61 | +2,06 |
vgg16_bn | 73,36 | 75.13 | +1,77 |
vgg19_bn | 74,24 | 75,68 | +1,44 |
resnet18 | 69,74 | 71,67 | +1,93 |
resnet34 | 73.30 | 74,60 | +1,30 |
resnet50 | 76,16 | 77,41 | +1,25 |
resnet101 | 77,37 | 78,38 | +1,01 |
resnet152 | 78,31 | 79.07 | +0,76 |
resnext50_32x4d | 77,62 | 77,93 | +0,31 |
resnext101_32x8d | 79,31 | 79,33 | +0,02 |
Wide_resnet50_2 | 78,47 | 78,70 | +0,23 |
Wide_resnet101_2 | 78,85 | 78,99 | +0,14 |
Densnet121 | 74,43 | 75,79 | +1,36 |
Densnet169 | 75,60 | 76,73 | +1,13 |
Densnet201 | 76,90 | 77.31 | +0,41 |
Densnet161 | 77,14 | 77,88 | +0,74 |
mobilenet_v2 | 71,88 | 72,72 | +0,84 |
ПОСЛЕДОВАТЕЛЬНОСТЬ | Базовый уровень | Сглаженный | Дельта |
---|---|---|---|
Алекснет | 78,18 | 83,31 | +5,13 |
vgg11 | 86,58 | 90.09 | +3,51 |
vgg13 | 86,92 | 90.31 | +3,39 |
vgg16 | 88,52 | 90,91 | +2,39 |
vgg19 | 89,17 | 91.08 | +1,91 |
vgg11_bn | 87,16 | 90,67 | +3,51 |
vgg13_bn | 88.03 | 91.09 | +3,06 |
vgg16_bn | 89,24 | 91,58 | +2,34 |
vgg19_bn | 89,59 | 91,60 | +2,01 |
resnet18 | 85.11 | 88,36 | +3,25 |
resnet34 | 87,56 | 89,77 | +2,21 |
resnet50 | 89.20 | 91,32 | +2,12 |
resnet101 | 89,81 | 91,97 | +2,16 |
resnet152 | 90,92 | 92,42 | +1,50 |
resnext50_32x4d | 90,17 | 91,48 | +1,31 |
resnext101_32x8d | 91,33 | 92,67 | +1,34 |
Wide_resnet50_2 | 90,77 | 92,46 | +1,69 |
Wide_resnet101_2 | 90,93 | 92.10 | +1,17 |
Densnet121 | 88,81 | 90,35 | +1,54 |
Densnet169 | 89,68 | 90,61 | +0,93 |
Densnet201 | 90,36 | 91,32 | +0,96 |
Densnet161 | 90,82 | 91,66 | +0,84 |
mobilenet_v2 | 86,50 | 87,73 | +1,23 |
Чтобы уменьшить беспорядок, здесь представлены расширенные результаты (различные размеры фильтров). Помогите улучшить результаты!
Эта работа доступна под лицензией Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Все материалы доступны по лицензии Creative Commons BY-NC-SA 4.0 от Adobe Inc. Вы можете использовать, распространять и адаптировать материал в некоммерческих целях при условии, что вы дадите соответствующую ссылку, цитируя нашу статью и указывая любые изменения. что ты сделал.
Репозиторий основан на репозитории примеров PyTorch и репозитории моделей torchvision. Они лицензированы в стиле BSD.
Если вы найдете это полезным для своих исследований, пожалуйста, рассмотрите возможность процитировать этот бибтекс. С любыми комментариями и отзывами обращайтесь к Ричарду Чжану <rizhang at adobe dot com>.