自动确定在keras CNN Conv2D层中使用的最佳滤波器大小

时间:2018-03-05 18:58:29

标签: keras

model.add(Conv2D(32, (5, 5),
                  padding='same',
                  data_format='channels_last',
                  input_shape=input_shape))


model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.25))

model.add(Dense(num_classes))
model.add(Activation('softmax'))

这就是我目前的keras模型,它完全借鉴here

我的问题有两部分,
1.如何自动确定是使用model.add(Conv2D(32, (3, 3)))还是model.add(Conv2D(32, (5,5)))还是model.add(Conv2D(32, (4,4)))? 2.除了模型的第一行,如果我将conv2D(64,(3,3))模型的其余部分改为(5,5),我得到`通过从3中减去5得到的负维度)。这是为什么?

我查看了这两个问题:Selecting number of strides and filters in CNN (Keras)Conv2D layer output shape in keras
根据他们的实验是唯一可以找到答案的方法,但我想知道是否有自动方法来做到这一点。 因为有很多参数,例如value of dropoutkernel_size(),然后Dense()的值应该是512/356或者最好的数量。

PS: 运行具有不同参数的不同模型正变得计算成本昂贵,并且比较所有这些结果正成为另一个痛苦的过程。 我的笔记本电脑有一块2GB的nvidia显卡,具有5.0的计算能力。

1 个答案:

答案 0 :(得分:1)

  1. 内核维度是超参数,您可以使用多种策略自动优化这些参数。 Here are a couple of tips for that

  2. 卷积层的输出高度/宽度遵循等式size = ((input_size - kernel_size) / stride) + 1。因此,对于太小的图像,您使用了太多的卷积图层。在某些时候size将为负数,您不能有负形状输出