输入形状明确固定时model.summary()输出形状含None的原因是什么?
Keras模型输出形状差异说明
核心原因
本质是TensorFlow Keras的层形状推断规则,差异来自你有没有在构建模型时显式声明输入形状:
- 第一段代码没给第一层指定输入形状,模型直到第一次收到训练数据才会推断形状,直接用了第一次接收到的批次大小固定了维度
- 第二段代码在Flatten层提前指定了输入形状,构建阶段就保留了批次维度的通用性,用None表示可适配任意批次大小
第一段代码输出(32, 10)的原因
你写的第一个模型,第一层直接用了没加input_shape参数的Dense层,这时候Keras根本不知道你要喂什么形状的数据,不会提前做形状推断。
等你调用model.fit()训练的时候,Keras默认批次大小是32,第一批送进去的训练数据形状正好是(32, 784),模型这时候才临时推断形状,直接把输入的第一维(批次维度)固定成了第一次拿到的32,所以后面所有层的输出形状第一维都显示为32。
注意:这种模型是有使用限制的,之后你传的所有数据批次大小必须是32,不然会报形状不匹配的错,没法用其他批次大小跑推理或者训练。
第二段代码输出(None, 10)的原因
第二个模型你在第一层Flatten就指定了input_shape=(28, 28),这个参数只定义了单张样本的形状,Keras会自动把批次维度留成可变的,用None表示这个位置可以是任意正整数。
这种模型是通用的,不管你传批次大小是1、32、64还是其他任何值的输入都能正常处理,所以输出形状的第一维就显示为通用的None。
内容的提问来源于stack exchange,提问作者JJJohn
相关产品推荐
相关产品推荐

