ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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


D
Daniel Möller

什么时候使用?

如果您使用的是 compile,那么它肯定必须在 load_model() 之后。毕竟,你需要一个模型来编译。 (PS:load_model 使用与模型一起保存的优化器自动编译模型)

compile 做什么?

Compile 定义了损失函数、优化器和指标。就这样。

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

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

您需要多次使用 compile 吗?

除非:

您想要更改其中之一:损失函数优化器/学习率指标某些层的可训练属性

损失函数

优化器/学习率

指标

某层的可训练属性

您加载(或创建)了一个尚未编译的模型。或者您的加载/保存方法没有考虑以前的编译。

再次编译的后果:

如果再次编译模型,您将丢失优化器状态。

这意味着你的训练一开始会受到一点影响,直到它调整学习率、动量等。但是绝对不会对权重造成损害(当然,除非你的初始学习率太大以至于第一次训练step 极大地改变了微调的权重)。


即使您最初使用 include_optimizer=True 保存模型,在重新编译后是否会丢失所有优化器状态?
您需要使用相同的优化器重新编译......但我不确定它是否可能。
@DanielMöller:它是否影响model.outputs,即编译后和编译前两者有什么区别?此外,如果您能解释 load_model(model, compile=False/True) 参数中 compile=False 的使用,那就太好了。
没有什么变化。编译就是为“训练”设置“优化器”和“损失”函数,仅此而已。如果你想加载一个模型并且你不会训练它,你不需要编译它。 1 - compile=True:模型将使用与保存相同的设置加载和编译。 2 - compile=False,您将只加载没有优化器的模型。
感谢您提醒我trainable。但是设置权重完全没有问题。
n
nbro

不要忘记,您还需要在更改层的 trainable 标志后编译模型,例如,当您想像这样微调模型时:

在没有顶级分类器的情况下加载 VGG 模型冻结所有层(即 trainable = False)向顶部添加一些层 编译并在一些数据上训练模型 通过设置 trainable = True 取消冻结 VGG 的某些层再次编译模型(DON不要忘记这一步!)在一些数据上训练模型


更改图层的可训练标志后不编译模型会导致什么结果?
@Kake_Fisk 更改将无效,即层的可训练状态将保持在最后一次 compile 方法调用之前的状态。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅