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 dropout
,kernel_size()
,然后Dense()
的值应该是512/356或者最好的数量。
PS: 运行具有不同参数的不同模型正变得计算成本昂贵,并且比较所有这些结果正成为另一个痛苦的过程。 我的笔记本电脑有一块2GB的nvidia显卡,具有5.0的计算能力。
答案 0 :(得分:1)
内核维度是超参数,您可以使用多种策略自动优化这些参数。 Here are a couple of tips for that
卷积层的输出高度/宽度遵循等式size = ((input_size - kernel_size) / stride) + 1
。因此,对于太小的图像,您使用了太多的卷积图层。在某些时候size
将为负数,您不能有负形状输出