2017-06-17 114 views
1

我使用Keras 1.1.1创建的cnn模型有两个卷积池层,后面是两个密集层,在第二个卷积池层和第一个密集层之后添加了丢失。的代码如下:Keras CNN模型参数计算

model = Sequential() 
#convolution-pooling layers 
model.add(Convolution2D(32, 5, 5, input_shape=input_shape)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Convolution2D(64, 5, 5)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 
#dense layers 
model.add(Flatten()) 
model.add(Dense(100)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add((Dense(2))) 
model.add(Activation('softmax')) 
#optimizer 
sgd = SGD(lr=1e-3, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='categorical_crossentropy', 
       optimizer = sgd, 
       metrics=['accuracy']) 
print model.summary() 

模型总结出表格如下:

enter image description here

我不清楚如何的第二卷积层的参数(即,51264的数由红色矩形指示)被计算。我认为这个数字是(5 * 5 + 1)* 64 = 1664,因为卷积核的大小是5 * 5,要提取64个特征地图。

此外,我已经实施了丢失。为什么参数表不能反映这一点。看起来没有丢失的参数号码被给出,尽管在表格中列出了丢失(层)。任何人都可以帮我解释参数摘要?

+0

关于丢失:这在训练期间随机禁用神经元。它们仍然存在于您的模型中,因此不会因模型摘要中的参数数量而减少。 – petezurich

+0

我认为你是对的 – jingweimo

回答

3

它是一个相当简单的计算与基本概念。并通过查看您的代码和模型总结这是我的步骤。

步骤1:式计算参数

total_params =
(filter_height * filter_width * input_image_channels + 1)* NUMBER_OF_FILTERS

步骤2:计算参数第一层

filter_height = 5
filter_weight = 5
input_image_channels = 1
number_of_filters = 32
虽然你还没有给我们提供了开关输入 图像通道,但我理解了它从你的参数值。现在

我们将计算为第一CONV层参数的数目。

total_param =(5 * 5 * 1 + 1)* 32 = 832

步骤3:同样,我们可以计算出第二CONV层。 请注意,来自上一层的滤镜数量将成为当前图层输入图像的通道数量。

filter_height = 5
filter_weight = 5
input_image_channels = 32
number_of_filters = 64

现在,我们将计算为第二CONV层参数的数目。

total_param =(5 * 5 * 32 + 1)* 64 = 51264

+1

谢谢!这是有道理的 – jingweimo

+0

嘿@jingweimo,如果我的答案是有道理的,你可以请接受它。 – blitu12345

2

至于问题的第二部分:

漏失层随机训练过程中禁用的神经元。它们仍然存在于您的模型中,因此不会从模型摘要中的参数数量中折扣。