当我开始训练模型时,之前没有保存任何模型。我可以安全地使用 model.compile()
。我现在已将模型保存在 h5
文件中,以便使用 checkpoint
进行进一步训练。
说,我想进一步训练模型。在这一点上我很困惑:我可以在这里使用 model.compile()
吗?它应该放在 model = load_model()
语句之前还是之后?如果 model.compile()
重新初始化所有权重和偏差,我应该将它放在 model = load_model()
语句之前。
在发现一些讨论之后,在我看来,只有当我以前没有保存模型时才需要 model.compile()
。保存模型后,无需使用 model.compile()
。是真的还是假的?而当我想使用经过训练的模型进行预测时,我应该在预测之前使用 model.compile()
吗?
什么时候使用?
如果您使用的是 compile
,那么它肯定必须在 load_model()
之后。毕竟,你需要一个模型来编译。 (PS:load_model
使用与模型一起保存的优化器自动编译模型)
compile
做什么?
Compile 定义了损失函数、优化器和指标。就这样。
它与权重无关,您可以根据需要多次编译模型,而不会对预训练的权重造成任何问题。
你需要一个编译好的模型来训练(因为训练使用损失函数和优化器)。但是没有必要编译一个模型来进行预测。
您需要多次使用 compile 吗?
除非:
您想要更改其中之一:损失函数优化器/学习率指标某些层的可训练属性
损失函数
优化器/学习率
指标
某层的可训练属性
您加载(或创建)了一个尚未编译的模型。或者您的加载/保存方法没有考虑以前的编译。
再次编译的后果:
如果再次编译模型,您将丢失优化器状态。
这意味着你的训练一开始会受到一点影响,直到它调整学习率、动量等。但是绝对不会对权重造成损害(当然,除非你的初始学习率太大以至于第一次训练step 极大地改变了微调的权重)。
不要忘记,您还需要在更改层的 trainable
标志后编译模型,例如,当您想像这样微调模型时:
在没有顶级分类器的情况下加载 VGG 模型冻结所有层(即 trainable = False)向顶部添加一些层 编译并在一些数据上训练模型 通过设置 trainable = True 取消冻结 VGG 的某些层再次编译模型(DON不要忘记这一步!)在一些数据上训练模型
compile
方法调用之前的状态。
不定期副业成功案例分享
model.outputs
,即编译后和编译前两者有什么区别?此外,如果您能解释load_model(model, compile=False/True)
参数中compile=False
的使用,那就太好了。compile=True
:模型将使用与保存相同的设置加载和编译。 2 -compile=False
,您将只加载没有优化器的模型。trainable
。但是设置权重完全没有问题。