首页 > 解决方案 > 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 后端

标签: pythontensorflowkeras

解决方案


很好的观察 - 我相信 Keras 文档应该更新。当没有提供输入形状时,Keras 从参数推断它,x然后Model.fit才构建整个模型。具体来说,这就是正在发生的事情:

  1. Sequential模型中添加 Keras 层时,由于从未设置参数input_shape(以及扩展名batch_input_shape),因此该属性Model.inputs保持不变None(请参阅 参考资料Sequential.add)。
  2. 然后,在 中Model.fit,他们检查是否Model.inputs已设置(参见Model.fitModel._standardize_user_data),如果没有,则从提供的输入数组推断输入形状。
  3. 最后,在 中,他们使用推断(参见)Model._set_inputs构建整个模型。input_shapeModel._set_inputs

这可以通过print(model.layers[0].get_weights())在拟合模型之前打印一些权重(例如 )来验证。你会看到,当参数input_shapeorbatch_input_shape没有提供给模型的第一层时,权重的数组是空的,因为模型尚未构建。


推荐阅读