我目前有一个 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))
The Keras 文档 https://keras.io/getting-started/sequential-model-guide/#specifying-the-input-shape告诉我:
模型需要知道它应该期望什么输入形状。因此,顺序模型中的第一层(并且只有第一层,因为后续层可以进行自动形状推断)需要接收有关其输入形状的信息
However,模型实际上训练得很好,没有错误,即使我从未指定输入的形状。
它如何知道期望的形状是什么?如果我不提供输入形状,默认行为是什么?它将如何影响我的模型?
编辑:这是使用tf.keras
,又名 keras 的 Tensorflow 后端
很好的观察 - 我相信 Keras 文档应该更新。当未提供输入形状时,Keras 会从参数中推断出它x
of Model.fit
然后它才会构建整个模型。具体来说,这是正在发生的事情:
- 在添加 Keras 层时
Sequential
模型,因为论证input_shape
(并且,通过扩展,batch_input_shape
) 从未设置,该属性Model.inputs
遗迹None
(see Sequential.add https://github.com/keras-team/keras/blob/master/keras/engine/sequential.py#L135-L180).
- 然后,在
Model.fit
,他们检查是否Model.inputs
已设置(参见Model.fit https://github.com/keras-team/keras/blob/master/keras/engine/training.py#L1150 and Model._standardize_user_data https://github.com/keras-team/keras/blob/88ca804d94a0f978d0522d82a2e2bda26362076a/keras/engine/training.py#L500-L504),如果没有,它们会从提供的输入数组推断输入形状。
- 最后,在
Model._set_inputs
,他们用推断建立了整个模型input_shape
(see Model._set_inputs https://github.com/keras-team/keras/blob/88ca804d94a0f978d0522d82a2e2bda26362076a/keras/engine/training.py#L409-L417).
这可以通过打印一些重量来验证(例如print(model.layers[0].get_weights())
)在拟合模型之前。你会看到,当争论input_shape
or batch_input_shape
未提供给模型的第一层,权重数组为空,因为模型尚未构建。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)