如何计算第二转换层中的参数数量?

时间:2019-03-11 09:49:38

标签: machine-learning keras conv-neural-network

我用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这样计算吗?

1 个答案:

答案 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