嗨我试图增加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像素的图像。 有人能指出我的模型有什么问题吗?
答案 0 :(得分:2)
我正在回答这个问题,因为我没有足够的代表发表评论。计算输出量的公式有一个小问题。 K *((W-F + 2P)/ S + 1)应为(K *((W-F + 2P)/ S))+ 1。
答案 1 :(得分:1)
答案很可能与图像大小有关。我的图像尺寸是28x28图像。当我们执行卷积和池化(没有零填充)时,要素图的大小将减小。因此,卷积和合并层的数量将受到限制,具体取决于输入图像的尺寸。
遵循http://cs231n.github.io/convolutional-networks/
中的公式要素图尺寸= K *((W-F + 2P)/ S + 1), 其中W - 输入音量大小, F Conv Layer神经元的感受野大小, 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]
操作来说太小了。
我猜这是错误的原因。
应用我上面的推测,我试图用更大的图像训练第二个网络,但不会出现错误。