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


81

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

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

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

Answers:


152

什么时候使用?

如果您正在使用compile,则一定要在之后load_model()。毕竟,您需要一个模型进行编译。(PS:使用load_model与模型一起保存的优化器自动编译模型)

怎么compile办?

编译定义损失函数优化器度量。就这样。

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

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

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

除非:

  • 您要更改其中之一:
    • 损失函数
    • 优化器/学习率
    • 指标
    • trainable某层的性质
  • 您加载(或创建)了尚未编译的模型。或者您的加载/保存方法没有考虑以前的编译。

再次编译的后果:

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

这意味着您的训练在开始时会受到一点影响,直到它调整学习速度,动量等为止。但是绝对不会对重量造成损害(除非您的初始学习速度如此之大,以至于第一次训练步骤会疯狂地更改微调的权重)。


1
即使您最初使用include_optimizer = True保存模型时,重新编译后使用use也会丢失所有优化器状态吗?
kawingkelvin

您需要使用相同的优化器进行重新编译...但是我不确定是否有可能。
丹尼尔·莫勒(DanielMöller),

1
@DanielMöller:它会影响model.outputs编译后和编译前两者的区别吗?另外,如果您可以解释compile=Falseinload_model(model, compile=False/True)参数的用法,那将是很好的。
aspiring1'1

2
没有什么改变。编译就是将“优化器”和“损失”功能设置为“训练”,仅此而已。如果要加载模型并且不进行训练,则无需编译。1- compile=True:将使用与保存的相同设置加载和编译模型。2- compile=False,您将仅加载没有优化器的模型。
DanielMöller19年

1
谢谢你让我想起trainable。但是设置权重根本没有问题。
丹尼尔·莫勒(DanielMöller)

28

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

  1. 无需顶级分类器即可加载VGG模型

  2. 冻结所有图层(即trainable = False

  3. 在顶部添加一些图层

  4. 在一些数据上编译和训练模型

  5. 通过设置解冻VGG的某些层 trainable = True

  6. 再次编译模型(不要忘记这一步!)

  7. 在一些数据上训练模型


1
更改图层的可训练标记后不编译模型会有什么结果?
Kake_Fisk

1
@Kake_Fisk更改将无效,即,该层的可培训性状态将保持与上次compile方法调用之前相同。
今天
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.