我用Keras中的Mnist编码了CNN模型。代码并按如下所示打印其摘要: cnn的代码:
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(63, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, name='dense', activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
模型摘要:
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 26, 26, 32) 320
_________________________________________________________________
conv2d_2 (Conv2D) (None, 24, 24, 63) 18207
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 12, 12, 63) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 12, 12, 63) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 9072) 0
_________________________________________________________________
dense (Dense) (None, 128) 1161344
_________________________________________________________________
dropout_2 (Dropout) (None, 128) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 1290
=================================================================
Total params: 1,181,161
Trainable params: 1,181,161
Non-trainable params: 0
_________________________________________________________________
第一和第二conv2D层的kernel_size
均为(3,3)
。
我不明白为什么在第二个conv2D层中有18207个参数。应该像(3*3+1)*63=630
这样计算吗?
答案 0 :(得分:2)
要获取参数数量,您需要应用以下公式:
(FxFxCi+1)xC0
FxF
是内核大小,C0
是输出通道,Ci
是输入通道。
因此,就您而言,您只是忘记了输入通道参数:
18207 = 63*(32*3*3+1)
编辑以回答评论:
当具有第一层的输出时,您将获得形状的“图像” :(无,26、26、32)(无是批处理大小)。 因此,直观地讲,您将需要学习每个维度(通道)的内核,因此将需要每个维度的内核,然后将其映射到输出维度。输出尺寸取决于内核的参数,还取决于内核的数量: 通常为每个通道计算卷积并求和。例如,您有一个(28,28,3)图片,其中包含3个内核(5,5,3)的转换,您的输出将是(24,24)图片(1输出通道)。每个维度都有1个内核,然后求和即可获得输出。
但是您也可以有多个卷积:
您仍然具有相同的图片(28,28,3),但是具有大小为(5,5,3,4)的卷积层。意味着您有上面描述的4个卷积。要获得大小为(24,24,4)的输出,您不需对转换进行求和,您可以将它们堆叠在一起以得到具有多个通道的图片。您可以同时学习多个独立的卷积。 因此,您会看到计算的来源。以及为什么输入通道和输出通道确实非常重要。但是它们代表了非常不同的参数。 (有关更多详细信息和视觉说明,请参见this