为何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
相关产品推荐
相关产品推荐

