0

我很难理解 Keras CNN 模型中层的输出形状和参数数量。

让我们以这个玩具为例:

model = Sequential()
model.add(Conv1D(7, kernel_size=40, activation="relu", input_shape=(60, 1)))
model.add(Conv1D(10, kernel_size=16, activation="relu"))
model.add(MaxPooling1D(pool_size=3))
model.summary()

输出是:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_17 (Conv1D)           (None, 21, 7)             287       
_________________________________________________________________
conv1d_18 (Conv1D)           (None, 6, 10)             1130      
_________________________________________________________________
max_pooling1d_11 (MaxPooling (None, 2, 10)             0         
=================================================================
Total params: 1,417
Trainable params: 1,417
Non-trainable params: 0
_________________________________________________________________

对于第一Conv1D层,有 7 个输出大小为 (60 - 40 + 1) = 21 的过滤器。考虑到偏差,参数数量为 (40 + 1) * 7 = 287。所以,我可以接受。

Conv1D但是第二层会在哪个维度上运行呢?我猜输出滤波器的大小是 21 - 16 + 1 = 6,但我不明白通过哪个操作我们可以将最后一个维度从 7 变为 10。我也不明白如何计算参数数量。

最后,我不了解MaxPooling1D图层的输出形状,因为我希望输出大小为 6 - 3 + 1 = 4 而不是 2。它是如何计算的?

4

1 回答 1

2

...但我不明白最后一个维度可以通过哪种操作从 7 变为 10。

通过与第一层从 1 到 7 相同的操作:卷积滤波器应用于其输入的整个最后一个轴(即维度),并在每个应用程序窗口产生一个数字。第二个卷积层有 10 个过滤器,因此每个窗口会生成 10 个值,因此最后一个轴的维度将为 10(同样的推理也适用于第一个卷积层)。

我也不明白如何计算参数数量。

有 10 个过滤器。正如我上面提到的,过滤器应用于整个最后一个轴。所以它们的宽度必须为 7(即输入的最后一个轴大小)。内核大小为 16。所以我们有:10 * (16 * 7) + 10(每个滤波器 1 个偏差)= 1130。

最后,我不了解MaxPooling1D图层的输出形状,因为我希望输出大小为 6 - 3 + 1 = 4 而不是 2。它是如何计算的?

默认情况下stride一维池化层的 等于pool_size。因此,在长度为 6 的序列上应用,大小为 3 的池化层将只有 2 个应用程序窗口。

注意:您可能还会发现此相关答案对 1D-conv 的工作原理很有用。

于 2020-04-14T18:06:13.503 回答