关于Keras模型30层输出的解读与权重矩阵疑问
模型结构解读疑问
我已经成功运行代码并打印出模型的层数信息,输出显示模型共有30层,具体层类型列表及Keras的model.summary()输出如下。现存在三个疑问:
- 该模型是否为6个模块各含5个隐藏层?
- 权重矩阵是仅针对这6个模块构建,还是运行时为全部30层构建?
- 该如何正确解读上述输出?
模型层类型列表
Number of layers: 30 Layer types: input_1 - InputLayer conv2d - Conv2D batch_normalization - BatchNormalization activation - Activation conv2d_1 - Conv2D batch_normalization_1 - BatchNormalization activation_1 - Activation conv2d_2 - Conv2D batch_normalization_2 - BatchNormalization add - Add activation_2 - Activation conv2d_3 - Conv2D batch_normalization_3 - BatchNormalization activation_3 - Activation conv2d_4 - Conv2D conv2d_5 - Conv2D batch_normalization_4 - BatchNormalization add_1 - Add activation_4 - Activation conv2d_6 - Conv2D batch_normalization_5 - BatchNormalization activation_5 - Activation conv2d_7 - Conv2D conv2d_8 - Conv2D batch_normalization_6 - BatchNormalization add_2 - Add activation_6 - Activation average_pooling2d - AveragePooling2D flatten - Flatten dense - Dense
Keras model.summary() 输出
__________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_1 (InputLayer) [(None, 32, 32, 3)] 0 __________________________________________________________________________________________________ conv2d (Conv2D) (None, 32, 32, 16) 448 input_1[0][0] __________________________________________________________________________________________________ batch_normalization (BatchNorma (None, 32, 32, 16) 64 conv2d[0][0] __________________________________________________________________________________________________ activation (Activation) (None, 32, 32, 16) 0 batch_normalization[0][0] __________________________________________________________________________________________________ conv2d_1 (Conv2D) (None, 32, 32, 16) 2320 activation[0][0] __________________________________________________________________________________________________ batch_normalization_1 (BatchNor (None, 32, 32, 16) 64 conv2d_1[0][0] __________________________________________________________________________________________________ activation_1 (Activation) (None, 32, 32, 16) 0 batch_normalization_1[0][0] __________________________________________________________________________________________________ conv2d_2 (Conv2D) (None, 32, 32, 16) 2320 activation_1[0][0] __________________________________________________________________________________________________ batch_normalization_2 (BatchNor (None, 32, 32, 16) 64 conv2d_2[0][0] __________________________________________________________________________________________________ add (Add) (None, 32, 32, 16) 0 activation[0][0] batch_normalization_2[0][0] __________________________________________________________________________________________________ activation_2 (Activation) (None, 32, 32, 16) 0 add[0][0] __________________________________________________________________________________________________ conv2d_3 (Conv2D) (None, 16, 16, 32) 4640 activation_2[0][0] __________________________________________________________________________________________________ batch_normalization_3 (BatchNor (None, 16, 16, 32) 128 conv2d_3[0][0] __________________________________________________________________________________________________ activation_3 (Activation) (None, 16, 16, 32) 0 batch_normalization_3[0][0] __________________________________________________________________________________________________ conv2d_4 (Conv2D) (None, 16, 16, 32) 9248 activation_3[0][0] __________________________________________________________________________________________________ conv2d_5 (Conv2D) (None, 16, 16, 32) 544 activation_2[0][0] __________________________________________________________________________________________________ batch_normalization_4 (BatchNor (None, 16, 16, 32) 128 conv2d_4[0][0] __________________________________________________________________________________________________ add_1 (Add) (None, 16, 16, 32) 0 conv2d_5[0][0] batch_normalization_4[0][0] __________________________________________________________________________________________________ activation_4 (Activation) (None, 16, 16, 32) 0 add_1[0][0] __________________________________________________________________________________________________ conv2d_6 (Conv2D) (None, 8, 8, 64) 18496 activation_4[0][0] __________________________________________________________________________________________________
问题解答
1. 是否是6个模块各含5个隐藏层?
不是。这是一个残差网络(ResNet)结构,从输出能看到3个完整的残差块(对应add、add_1、add_2层),每个残差块是由卷积、BN、激活、残差连接等多个层组合而成的单元,再加上输入层、最后的池化、Flatten和全连接层,总共凑够30层。
所谓“6个模块各5层”的划分完全不符合实际结构——残差块的层数量不固定,且模型的核心模块是残差块,不是均分的5层小模块。
2. 权重矩阵的构建范围?
权重矩阵是针对所有带可训练参数的层构建的,和“模块”划分无关。
看model.summary()里的Param #列就能明确:
Conv2D、BatchNormalization、Dense这些层有可训练参数,会构建对应的权重矩阵;Activation、Add、InputLayer、AveragePooling2D、Flatten这些层没有可训练参数(Param #为0),不需要构建权重矩阵。
运行时,所有带参数的层都会初始化权重,训练过程中也会更新这些权重,覆盖30层里的所有可训练层。
3. 如何正确解读输出?
层类型列表解读
这个列表按模型的执行顺序,依次列出了每一层的名称和类型,能快速帮你梳理模型用到的所有操作类型,比如卷积、批量归一化、残差连接、池化等,同时确认总层数为30。
model.summary()解读
这是Keras最直观的模型结构报告,重点关注这几个维度:
- Layer (type):明确每一步的操作类型和层名称;
- Output Shape:跟踪数据在模型中的维度变化,
None代表批量大小不固定,后面的数值是特征图的高、宽、通道数; - Param #:该层的可训练参数数量,参数越多学习能力越强,但也更容易过拟合;
- Connected to:显示层的输入来源,比如
add层同时连接了activation[0][0]和batch_normalization_2[0][0],这就是残差连接的核心——把前期的特征图和当前卷积后的特征图相加,缓解深度网络的退化问题。
整体来看,这个模型的流程是:输入图像→基础卷积+BN+激活→多轮残差块学习→全局池化扁平化特征→全连接层输出分类结果。
内容的提问来源于stack exchange,提问作者user22049227
相关产品推荐
相关产品推荐

