Keras CNN模型参数计算

时间:2017-06-17 19:21:52

标签: keras

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

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个特征映射。

此外,我已经实施了辍学。为什么参数表不能反映这一点。虽然表中列出了丢失(层),但似乎没有给出丢失的参数号。任何人都可以帮我解释参数摘要吗?

3 个答案:

答案 0 :(得分:24)

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

第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
     虽然你没有给我们提供插入物      图像通道,但我从您的参数值中找出它。

现在我们将计算第一个转换层的参数数量。

  

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

第3步:同样我们可以计算第2个转换层。 请注意,上一层的过滤器数量会成为当前图层输入图像的通道数。

  

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

现在我们将计算第二个转换层的参数数量。

  

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

答案 1 :(得分:4)

关于问题的第二部分:

Dropout Layer在训练期间随机禁用神经元。它们仍然存在于您的模型中,因此不会从模型摘要中的参数数量中打折。

答案 2 :(得分:0)

在创建网络后输入 model.count_params()。