На 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 лазаньи.