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计算能力 .
1 回答
内核维度是超参数,您可以使用多种策略自动优化这些参数 . Here are a couple of tips for that
卷积层的输出高度/宽度遵循等式
size = ((input_size - kernel_size) / stride) + 1
. 因此,对于太小的图像,您使用了太多的卷积图层 . 在某些时候size
将是负数,你不能有负形状输出