model.compile()是否初始化Keras中的所有权重和偏差(tensorflow后端)?

时间:2017-12-27 16:15:21

标签: tensorflow keras

当我开始训练模型时,之前没有保存模型。我可以安全地使用model.compile()。我现在已将模型保存在h5文件中,以便使用checkpoint进行进一步培训。

说,我想进一步训练模型。我现在很困惑:我可以在这里使用model.compile()吗?它应该放在model = load_model()声明之前还是之后?如果model.compile()重新初始化所有权重和偏见,我应该将它放在model = load_model()语句之前。

在发现一些讨论之后,在我看来,只有在我之前没有保存模型时才需要model.compile()。保存模型后,无需使用model.compile()。这是真是假?当我想使用训练模型预测时,我应该在预测之前使用model.compile()吗?

2 个答案:

答案 0 :(得分:50)

何时使用?

如果您正在使用compile,肯定必须在load_model()之后。毕竟,你需要一个模型来编译。

compile做什么?

编译定义损失功能优化器指标。就这样。

它与权重无关,您可以根据需要多次编译模型,而不会对预训练的权重造成任何问题。

您需要一个已编译的模型来训练(因为训练使用了损失函数和优化器)。但是没有必要编译预测模型。

您是否需要多次使用编译?

仅限于:

  • 您想要更改其中一个:
    • 损失函数
    • 优化程序/学习率
    • 指标
  • 您加载(或创建)尚未编译的模型。或者你的加载/保存方法没有考虑以前的编译。

再次编译的后果:

如果再次编译模型,则会丢失优化程序状态

这意味着你的训练在开始时会受到一点点影响,直到它调整学习速度,动力等等。但是对于重量绝对没有损害(当然,除非你的初始学习率如此之大,第一个训练步骤大大改变了微调重量)。

答案 1 :(得分:6)

别忘了,您还需要在更改图层的trainable标志(例如,当您想要微调这样的模型时:

# load VGG model without top classifier

# freeze all the layers (i.e. `trainable = False`)

# add some layers to the top

# compile and train the model on some data

# un-freeze some of the layers of VGG by setting `trainable = True`

# compile the model again  <-- DON'T FORGET THIS STEP!

# train the model on some data