Keras Sequential 不提供输入形状

Mig*_*ell 10 python keras tensorflow

我目前有一个 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))
Run Code Online (Sandbox Code Playgroud)

Keras文档告诉我:

模型需要知道它应该期望什么输入形状。出于这个原因,顺序模型中的第一层(并且只有第一层,因为后续层可以进行自动形状推断)需要接收有关其输入形状的信息

然而,模型实际上训练得很好,没有错误,即使我从未指定输入的形状。

它如何知道期望什么形状?如果我不提供输入形状,默认行为是什么?它将如何影响我的模型?

编辑:这是使用tf.keras,又名 keras 的 Tensorflow 后端

rvi*_*nas 14

很好的观察 - 我相信 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_shape(参见Model._set_inputs)构建了整个模型。

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

  • 这似乎是最正确的答案。形状检测不是特定于张量流的功能,但它仅在“tf.keras”中正确记录。 (2认同)