【问题标题】:How to compute the number of parameters in the second conversional layer?如何计算第二个转换层的参数个数?
【发布时间】:2019-08-01 14:33:06
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

(FxFxCi+1)xC0

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

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

编辑回答 cmets

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

但你也可以有多个卷积:

您仍然有相同的图片 (28,28,3),但随后有一个大小为 (5,5,3,4) 的卷积层。这意味着你有我们上面描述的 4 个卷积。要获得大小为 (24,24,4) 的输出,您不需要对 conv 求和,而是将它们堆叠以获得具有多通道的图片。您同时学习多个独立的卷积。 因此,您会看到计算的来源。以及为什么输入通道和输出通道确实非常重要。但它们代表了非常不同的参数。 (有关更详细和直观的解释,请参阅this

【讨论】:

  • 谢谢,但我有点困惑。为什么我需要对输入通道参数 32 进行计时?这是否意味着第二层的过滤器需要针对上一层的不同通道使用不同的内核参数?
  • 更新答案@david(告诉我是否还有暗区)
  • @david 换句话说,内核大小就像隐藏层中的节点数,它决定了输出形状而不是可训练变量的数量。所以更多的输入需要更多的变量来连接到隐藏层。
  • @anishtain4 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2021-05-01
  • 2017-12-12
  • 1970-01-01
  • 2012-04-24
  • 2018-03-22
相关资源
最近更新 更多