关于Keras中model.summary()的含义及Conv1D层维度的技术咨询
解答Keras新手的两个问题
1. 关于model.summary()的含义
model.summary()绝对是Keras新手的好帮手,它能把你搭建的模型结构拆解得明明白白,帮你快速确认模型是否符合预期,还能帮你排查参数计算的合理性。
它的输出每一列都有明确意义:
- 第一列:层的名称(比如你这里的
reshape、conv1d),要么是你定义层时指定的名字,要么是Keras自动生成的 - 第二列:层的类型(比如
Reshape、Conv1D),一眼就能知道这一层负责什么操作 - 第三列:输出形状(比如
(None, 66, 1)),你已经懂None是批量大小,后面的数字就是该层输出的特征维度 - 第四列:参数数量,这一层需要训练的参数个数(像Reshape、MaxPooling这类只做形状变换或采样的层,没有可训练参数,所以显示0)
最后给出的三个参数统计也很重要:
Total params:模型所有参数的总数Trainable params:实际参与训练更新的参数数(如果冻结了某些层,这里会比总参数少)Non-trainable params:不参与训练的参数(比如预训练模型里被冻结的层)
2. 关于Conv1D层输出形状里的66是什么
直接给你结论:这个66是Conv1D层的输出序列长度,不过它刚好和该层的输入序列长度相等,这和你代码里的padding='same'设置直接相关。
结合你的代码和模型结构拆解一下:
- Reshape层的输出是
(None, 66, 1),这就是Conv1D层的输入形状——输入序列长度是66,通道数是1 - 你给Conv1D层设置了
padding='same',这种填充方式会在输入序列的两端补0,保证输出序列的长度和输入序列完全一致。再加上你的kernel_size=3,计算下来输出序列长度还是66,所以Conv1D层的输出形状就是(None, 66, 32)(32是你指定的输出通道数) - 后面的MaxPooling1D用了
pool_size=2和strides=2,再加上padding='same',66除以2得到33,对应下一层(None, 33, 32)的输出形状,这也能反过来验证前面的逻辑是对的
总结一下:这个66不是“输入形状”,而是该Conv1D层的输出序列长度,只是因为padding的设置,它和输入序列长度刚好相等而已。
内容的提问来源于stack exchange,提问作者Noob3456
相关产品推荐
相关产品推荐

