在Keras中使用深度卷积神经网络

大家好,我正在尝试增加现有卷积网络的深度。以下是现有网络的结构:

model = Sequential()model.add(Convolution2D(32, nb_conv, nb_conv, border_mode='valid', input_shape=(1, img_rows, img_cols)))model.add(Activation('relu'))model.add(Convolution2D(32, nb_conv, nb_conv))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))model.add(Dropout(0.25))model.add(Convolution2D(64, nb_conv, nb_conv, border_mode='valid'))model.add(Activation('relu'))model.add(Convolution2D(64, nb_conv, nb_conv))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(512))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(256))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(nb_classes))model.add(Activation('softmax'))model.compile(loss='categorical_crossentropy', optimizer='adadelta')

我尝试通过添加几个卷积层来增加网络的深度,如下所示:

model = Sequential()model.add(Convolution2D(32, nb_conv, nb_conv, border_mode='valid', input_shape=(1, img_rows, img_cols)))model.add(Activation('relu'))model.add(Convolution2D(32, nb_conv, nb_conv))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))model.add(Dropout(0.25))model.add(Convolution2D(64, nb_conv, nb_conv, border_mode='valid'))model.add(Activation('relu'))model.add(Convolution2D(64, nb_conv, nb_conv))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))model.add(Dropout(0.25))model.add(Convolution2D(128, nb_conv, nb_conv, border_mode='valid'))model.add(Activation('relu'))model.add(Convolution2D(128, nb_conv, nb_conv))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(512))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(256))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(nb_classes))model.add(Activation('softmax'))model.compile(loss='categorical_crossentropy', optimizer='adadelta')

Keras 给我返回了一个错误。我不确定哪里出了问题,但似乎是张量形状不对。以下是错误信息:

This could be a known bug in CUDA, please see the GpuCorrMM() documentation.Apply node that caused the error: GpuCorrMM{valid, (1, 1)}(GpuContiguous.0, GpuContiguous.0)Toposort index: 181Inputs types: [CudaNdarrayType(float32, 4D), CudaNdarrayType(float32, 4D)]Inputs shapes: [(128, 128, 2, 2), (128, 128, 3, 3)]Inputs strides: [(512, 4, 2, 1), (1152, 9, 3, 1)]Inputs values: ['not shown', 'not shown']Outputs clients: [[GpuElemwise{Add}[(0, 0)](GpuCorrMM{valid, (1, 1)}.0, GpuReshape{4}.0)]]HINT: Re-running with most Theano optimization disabled could give you a back-trace of when this node was created. This can be done with by setting the Theano flag 'optimizer=fast_compile'. If that does not work, Theano optimizations can be disabled with 'optimizer=None'.HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node.

我的输入是28×28像素的图像。谁能指出我的模型哪里出了问题?


回答:

答案很可能与图像大小有关。我的图像大小是28×28像素。当我们执行卷积和池化操作(没有零填充)时,特征图的大小会减小。因此,卷积和池化层的数量将受到输入图像尺寸的限制。

以下公式来自 http://cs231n.github.io/convolutional-networks/

特征图尺寸 = K*((W−F+2P)/S+1),其中 W – 输入体大小,F – 卷积层神经元的感受野大小,S – 应用的步长,P – 边界上使用的零填充量,K – 卷积层的深度

现在我们先不考虑卷积层的深度。我们只想计算每次 [CONV -> CONV -> POOL] 操作后生成的特征图的高度和宽度。

对于上面的第一个网络,我应用了两次 [CONV -> CONV -> POOL] 操作。让我们计算生成的特征图。

给定 F=3, P=0, S=1, W=28,第一个 [CONV -> CONV -> POOL] 操作的输出是:

[CONV]

特征图尺寸 = (W−F+2P)/S+1 = (28 – 3 + 0)/1 = 26

[CONV]

特征图尺寸 = (W−F+2P)/S+1 = (26-3 + 0)/1 = 23

[POOL]

应用池化操作后结果为 23/2 = 11

这意味着在第一次 [CONV -> CONV -> POOL] 操作后,特征图现在有11×11像素

让我们对11×11的特征图应用第二次 [CONV -> CONV -> POOL] 操作。我们发现最终会得到一个2×2像素的特征图。

现在,如果我们尝试应用第三次 [CONV -> CONV -> POOL] 操作,就像我在第二个网络中想要做的那样。我们发现2×2的特征图尺寸对于另一个 [CONV -> CONV -> POOL] 操作来说太小了。

我猜这就是错误的原因。

根据我上面的推测,我尝试用更大的图像训练第二个网络,错误没有出现。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注