lasagne - Как его Conv2DDNNLayer работает с четным размером фильтра в «том же» режиме? - PullRequest
0 голосов
/ 17 сентября 2018

На https://lasagne.readthedocs.io/en/latest/modules/layers/dnn.html

сказано, для lasagne.layers.dnn.Conv2DDNNLayer,

«одинаковых» пэдов с половиной размера фильтра (округлено в меньшую сторону)с обеих сторон.Когда шаг = 1, это приводит к выходному размеру, равному входному размеру.Даже размер фильтра не поддерживается.

Тем не менее, я вижу, что кто-то использует фильтр четного размера с "таким же" режимом.

Они заняли 2-е место в конкурсе по выявлению диабетической ретинопатии Kaggle..

https://www.kaggle.com/c/diabetic-retinopathy-detection/discussion/15617

исходный код: https://github.com/sveitser/kaggle_diabetic

Обратите внимание, что в configs / c_128_4x4_32.py :

онисоздайте сверточные слои следующим образом:

(Conv2DLayer, cp(n, stride=(2, 2)))

где

from config import Config
from data import BALANCE_WEIGHTS
from layers import *
# -----SKIPPED SOME CODES HERE-----
def cp(num_filters, *args, **kwargs):
    args = {
        'num_filters': num_filters,
        'filter_size': (4, 4),
    }
    args.update(kwargs)
    return conv_params(**args)

n = 32

и Layers.py :

# -----SKIPPED SOME CODES HERE-----
try:
    import lasagne.layers.dnn
    Conv2DLayer = lasagne.layers.dnn.Conv2DDNNLayer
    MaxPool2DLayer = lasagne.layers.dnn.MaxPool2DDNNLayer 
    Pool2DLayer = lasagne.layers.dnn.Pool2DDNNLayer
    print("using CUDNN backend")
except ImportError:
    print("failed to load CUDNN backend")
    try:
        import lasagne.layers.cuda_convnet
        Conv2DLayer = lasagne.layers.cuda_convnet.Conv2DCCLayer
        Pool2DLayer = lasagne.layers.cuda_convnet.Pool2DLayer
        MaxPool2DLayer = lasagne.layers.cuda_convnet.MaxPool2DCCLayer
        print("using CUDAConvNet backend")
    except ImportError as exc:
        print("failed to load CUDAConvNet backend")
        Conv2DLayer = lasagne.layers.conv.Conv2DLayer
        MaxPool2DLayer = lasagne.layers.pool.MaxPool2DLayer
        Pool2DLayer = MaxPool2DLayer
        print("using CPU backend")
# -----SKIPPED SOME CODES HERE-----
def conv_params(num_filters, filter_size=(3, 3), border_mode='same',nonlinearity=leaky_rectify, W=init.Orthogonal(gain=1.0),b=init.Constant(0.05), untie_biases=True,**kwargs):
    args = {
    'num_filters': num_filters,
    'filter_size': filter_size, 
    'border_mode': border_mode,
    'nonlinearity': nonlinearity, 
    'W': W, 
    'b': b,
    'untie_biases': untie_biases,
    }
    args.update(kwargs)
    return args

Это показывает, что онидействительно использовал фильтр четного размера (4x4) с «тем же» режимом, и он как-то работал.

Поскольку я изучаю их решение и пытаюсь сделать его версию с тензорным потоком, мне важно знать что сделала эта функция , независимо от того, работала ли она «как задумано».

Эта проблема также связана с моделью сети или, более конкретно, с сеткой B вих отчет (https://github.com/sveitser/kaggle_diabetic/blob/master/doc/report.pdf), где сверточный слой с фильтром 4x4 и размером шага 1, в «том же» режиме, производитредактировал выход 56x56 с входом 57x57 (чистый B, уровень 7).На самом деле, именно здесь я впервые заметил эту проблему.Та же настройка (шаг 1, фильтр 4x4, «тот же» режим) в тензорном потоке приведет к выходу 57x57 вместо 56x56.

Итак, что в этом случае будет делать Conv2DDNNLayer?

Редактировать: дополнительная информация: Я заметил, что в кодах выше ((Conv2DLayer, cp(n, stride=(2, 2)))) это не такt передать переменную pad в Conv2DDNNLayer.Вместо этого border_mode передается в него, и для него было установлено "то же самое", что и по умолчанию в conv_params.Однако я не нашел border_mode в документации Conv2DDNNLayer.

Кто-нибудь знает, откуда взялась эта border_mode?

Имеет ли Conv2DDNNLayerведут себя по-разному, когда он установлен в «тот же» режим с помощью border_mode вместо pad?

Редактировать 2: я сейчас использую обходной путь, который в тензорном потоке я вручную дополняю изображения 1пиксель 0 на каждой стороне, а затем применить фильтр 4x4 в «действительном» режиме.Это даст выход 56x56, но я не знаю, будет ли это так же, как будет вести себя Conv2DDNNLayer лазаньи.

...