千层面-它的Conv2DDNNLayer如何在“相同”模式下使用均匀的滤镜大小?

时间:2018-09-17 10:01:32

标签: python theano lasagne

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

对于lasagne.layers.dnn.Conv2DDNNLayer,

  

“相同”的打击垫,两侧的过滤器尺寸减半(向下取整)。   当步幅= 1时,这将导致输出大小等于输入大小。   甚至不支持过滤器尺寸。

但是,我确实看到有人在“相同”模式下使用均匀的过滤器大小。

它们是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),并且以某种方式起作用。

因为我正在研究他们的解决方案并尝试制作它的张量流版本,所以无论它是否“按设计工作”,了解 该功能的作用对我来说都很重要“。

此问题还与他们的网络模型有关,或更具体地说,与他们的报告(https://github.com/sveitser/kaggle_diabetic/blob/master/doc/report.pdf中的网络B有关,在该网络中,具有4x4过滤器且步长为1的卷积层在“相同”模式下产生了一个56x56输出和57x57输入(网络B,第7层)。实际上,这是我第一次注意到此问题的地方。张量流中的相同设置(步幅1,过滤器4x4,“相同”模式)将导致输出为57x57,而不是56x56。

那么,在这种情况下,Conv2DDNNLayer会做什么?

编辑:其他信息:我注意到在上面的代码((Conv2DLayer, cp(n, stride=(2, 2))))中,它没有将变量pad传递给Conv2DDNNLayer。而是将border_mode传递给它,并且在conv_params中将其默认设置为“ same”。但是,我在Conv2DDNNLayer的文档中找不到border_mode

有人知道border_mode的来源吗?

如果border_mode而非pad将Conv2DDNNLayer设置为“相同”模式,行为会有所不同吗?

编辑2:我现在正在使用一种变通方法,在tensorflow中,我手动将图像的每一侧填充为1像素0,然后在“有效”模式下应用4x4滤镜。这样将获得56x56的输出,但我不知道这是否与千层面Conv2DDNNLayer的行为相同。

0 个答案:

没有答案