【问题标题】:Deep Convolutional Neural Network in KerasKeras 中的深度卷积神经网络
【发布时间】:2016-01-08 05:44:00
【问题描述】:

您好,我正在尝试增加 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: 181
Inputs 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 x 28 像素的图像。 谁能指出我的模型有什么问题?

【问题讨论】:

    标签: python machine-learning conv-neural-network keras


    【解决方案1】:

    我正在回答这个问题,因为我没有足够的代表发表评论。计算输出量的公式有一个小问题。 K*((W-F+2P)/S+1) 应该是 (K*((W-F+2P)/S))+1。

    【讨论】:

      【解决方案2】:

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

      以下公式来自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] 操作之后,特征图现在有 11x11 像素

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

      现在,如果我们尝试应用第三个[CONV -> CONV -> POOL] 操作,就像我想在第二个网络中做的那样。我们发现 2x2 特征图的维度太小,无法进行另一个[CONV -> CONV -> POOL] 操作。

      我猜这是错误的原因。

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

      【讨论】:

        猜你喜欢
        • 2016-11-05
        • 2015-04-09
        • 2014-08-24
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 1970-01-01
        • 2019-08-18
        • 2017-07-31
        相关资源
        最近更新 更多