python - Keras Sequential 不提供输入形状
问题描述
我目前有一个看起来像这样的 keras 模型:
model = keras.Sequential()
model.add(keras.layers.Dense(100, activation=tf.nn.relu))
model.add(keras.layers.Dense(100, activation=tf.nn.relu))
model.add(keras.layers.Dense(len(labels), activation=tf.nn.softmax))
Keras文档告诉我:
模型需要知道它应该期望什么输入形状。出于这个原因,顺序模型中的第一层(并且只有第一层,因为后面的层可以进行自动形状推断)需要接收有关其输入形状的信息
然而,模型实际上训练得很好,没有错误,即使我从未指定输入的形状。
它如何知道预期的形状?如果我不提供输入形状,默认行为是什么?它将如何影响我的模型?
编辑:这是使用tf.keras
,也就是 keras 的 Tensorflow 后端
解决方案
很好的观察 - 我相信 Keras 文档应该更新。当没有提供输入形状时,Keras 从参数推断它,x
然后Model.fit
才构建整个模型。具体来说,这就是正在发生的事情:
- 在
Sequential
模型中添加 Keras 层时,由于从未设置参数input_shape
(以及扩展名batch_input_shape
),因此该属性Model.inputs
保持不变None
(请参阅 参考资料Sequential.add
)。 - 然后,在 中
Model.fit
,他们检查是否Model.inputs
已设置(参见Model.fit
和Model._standardize_user_data
),如果没有,则从提供的输入数组推断输入形状。 - 最后,在 中,他们使用推断(参见)
Model._set_inputs
构建整个模型。input_shape
Model._set_inputs
这可以通过print(model.layers[0].get_weights())
在拟合模型之前打印一些权重(例如 )来验证。你会看到,当参数input_shape
orbatch_input_shape
没有提供给模型的第一层时,权重的数组是空的,因为模型尚未构建。