You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Keras模型30层输出的解读与权重矩阵疑问

模型结构解读疑问

我已经成功运行代码并打印出模型的层数信息,输出显示模型共有30层,具体层类型列表及Keras的model.summary()输出如下。现存在三个疑问:

  1. 该模型是否为6个模块各含5个隐藏层?
  2. 权重矩阵是仅针对这6个模块构建,还是运行时为全部30层构建?
  3. 该如何正确解读上述输出?

模型层类型列表

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:12:04