在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的行为相同。