我很难理解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。它是如何计算的?
。。。但我不明白通过哪种运算,我们可以在最后一个维度从7到10。
通过在第一层从1到7的相同操作:卷积滤波器应用于其输入的最后一个轴(即维度(,并在每个应用程序窗口产生一个数字。第二卷积层中有10个滤波器,因此每个窗口将生成10个值,因此最后一个轴的维度将为10(同样的推理也适用于第一卷积层(。
我也不明白参数的数量是如何计算的。
共有10个筛选器。如上所述,过滤器应用于整个最后一个轴。因此,它们必须具有7的宽度(即其输入的最后一个轴大小(。内核大小为16。所以我们有:10*(16*7(+10(每个滤波器1个偏置(=1130。
最后,我不理解
MaxPooling1D
层的输出形状,因为我希望输出大小是6-3+1=4,而不是2。它是如何计算的?
1D池化层的stride
默认等于pool_size
。因此,在长度为6的序列上应用,大小为3的池化层将只有2个应用窗口。
注意:您可能还发现这个关于1D conv如何工作的相关答案很有用。