gpt4 book ai didi

machine-learning - 如何计算第二转换层的参数数量?

转载 作者:行者123 更新时间:2023-11-30 09:31:42 24 4
gpt4 key购买 nike

我在 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 那样计算吗?

最佳答案

要获取参数数量,您需要应用以下公式:

(FxFxCi+1)xC0

其中,FxF 是内核大小,C0 是输出 channel ,Ci 是输入 channel 。因此,在您的情况下,您只是忘记了输入 channel 参数:

18207 = 63*(32*3*3+1)

编辑以回答评论:

当您获得第一层的输出时,您将获得形状的“图像”:(无、26、26、32)(无是批量大小)。因此,直观上您将需要学习每个维度( channel )的内核,因此每个维度都需要一个内核,然后将其映射到输出维度。输出维度取决于内核的参数以及内核的数量:通常对每个 channel 计算卷积并求和。例如,您有一个 (28,28,3) 图片,其卷积为 3 个内核 (5,5,3),您的输出将是 (24,24) 图片(1 个输出 channel )。每个维度都有 1 个内核,然后将其求和以获得输出。

但是你也可以有多个卷积:

你仍然有相同的图片(28,28,3),但有一个大小为(5,5,3,4)的卷积层。这意味着您有 4 个我们上面描述的卷积。要获得大小为 (24,24,4) 的输出,您不需要对转换求和,而是将它们堆叠起来以获得具有多 channel 的图片。您同时学习多个独立的卷积。所以你知道计算是从哪里来的。为什么输入 channel 确实非常重要,输出 channel 也是如此。但它们代表了非常不同的参数。 (有关更多详细信息和视觉说明,请参阅 this)

关于machine-learning - 如何计算第二转换层的参数数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55099133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com