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

为何Keras的model.summary()未体现输入层规模?

问题解惑:Keras Dense层参数计算差异原因

问题描述

在3b1b的神经网络示例中,模型输入层含784个神经元,后续为两个16神经元的Dense层和一个10神经元的Dense层,按逻辑参数应为 784×16+16 +16×16+16 +16×10+10=13002。

但通过Julia调用Keras创建input_shape=(784,1)的模型后,model.summary()输出如下:

Model: "model_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 784, 1)]          0         
                                                                
 dense_8 (Dense)             (None, 784, 16)           32        
                                                                
 dense_9 (Dense)             (None, 784, 16)           272       
                                                                
 dense_10 (Dense)            (None, 784, 10)           170       
                                                                
=================================================================
Total params: 474
Trainable params: 474
Non-trainable params: 0
_________________________________________________________________

生成该结果的代码:

#I'm using Keras through Julia so the code may look different?
input_shape = (784,1)
inputs = layers.Input(input_shape)
outputs = layers.Dense(16)(inputs)
outputs = layers.Dense(16)(outputs)
outputs = layers.Dense(10)(outputs)
model = keras.Model(inputs, outputs)
model.summary()

该结果未体现输入层规模,且当将input_shape改为(1,1)时,参数总数仍为474。

原因解析

Keras中Dense层默认对输入张量的最后一个维度执行全连接运算,而非将整个输入张量视为单个样本的特征向量:

  • 当设置input_shape=(784,1)时,每个样本是(784,1)形状的张量,可理解为784个独立的1维特征。第一个Dense(16)层会对每个位置的1维特征单独做全连接,参数数为 输入维度×输出维度 + 输出维度(偏置),即1×16+16=32,与summary输出一致。
  • 第二个Dense(16)层输入为(784,16),同样对每个位置的16维特征做全连接,参数数为16×16+16=272。
  • 第三个Dense(10)层参数数为16×10+10=170,三者总和32+272+170=474,因此修改input_shape的第一个维度(如改成(1,1))不影响参数数量——因为Dense层只关注最后一维。

而3b1b示例中的784个神经元对应Keras的input_shape=(784,),即单个样本是长度为784的一维向量。此时第一个Dense(16)层会将784个输入神经元全部连接到16个输出神经元,参数数为784×16+16,后续层按此逻辑计算,总和即为预期的13002。

解决方案

若要匹配3b1b的模型结构,只需将输入形状改为(784,):

input_shape = (784,)
inputs = layers.Input(input_shape)
outputs = layers.Dense(16)(inputs)
outputs = layers.Dense(16)(outputs)
outputs = layers.Dense(10)(outputs)
model = keras.Model(inputs, outputs)
model.summary()

内容的提问来源于stack exchange,提问作者jshji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:35:19