我的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()
模型摘要如下表所示:
我不清楚如何计算第二卷积层的参数数量(即,由红色矩形表示的51264)。我认为数字将是(5 * 5 + 1)* 64 = 1664,因为卷积内核的大小为5 * 5,并且要提取64个特征映射。
此外,我已经实施了辍学。为什么参数表不能反映这一点。虽然表中列出了丢失(层),但似乎没有给出丢失的参数号。任何人都可以帮我解释参数摘要吗?
答案 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()。