我的cnn模型是使用Keras 1.1.1创建的,它有两个卷积池层,然后是两个密集层,在第二个卷积池层和第一个密集层之后添加了dropout。代码如下:
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个特征映射。
此外,我已经实现了dropout。为什么参数表不能反映这一点。虽然表中列出了dropout (层),但似乎给出了不带dropout的参数编号。谁能帮我解释一下参数汇总?
发布于 2017-06-18 17:08:10
通过查看您的代码和模型摘要,这是一个使用基本concept.And进行的相当简单的计算,这是我的步骤。
第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
第三步:,同样,我们可以计算第二个卷积层。请注意,上一层的滤镜数量将成为当前层输入图像的通道数量。
filter_height = 5
filter_weight = 5,
input_image_channels = 32
number_of_filters = 64
现在我们将计算第二个conv层的参数数量。
total_param = (5*5*32 + 1)*64 = 51264
发布于 2017-06-18 21:54:01
有关问题的第二部分:
Dropout层在训练期间随机禁用神经元。它们仍然存在于您的模型中,因此不会从模型摘要中的参数数量中扣除。
发布于 2021-06-17 11:54:20
在创建网络后键入model.count_params()。
https://stackoverflow.com/questions/44608552
复制相似问题