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

Posted

技术标签:

【中文标题】model.compile() 是不是初始化 Keras(tensorflow 后端)中的所有权重和偏差?【英文标题】:Does model.compile() initialize all the weights and biases in Keras (tensorflow backend)?model.compile() 是否初始化 Keras(tensorflow 后端)中的所有权重和偏差? 【发布时间】:2018-06-08 06:49:20 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

何时使用?

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

compile 有什么作用?

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

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

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

您需要多次使用 compile 吗?

仅当:

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

再次编译的后果:

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

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

【讨论】:

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

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

    在没有***分类器的情况下加载 VGG 模型

    冻结所有层(即trainable = False

    在顶部添加一些图层

    根据一些数据编译和训练模型

    通过设置trainable = True来解冻VGG的一些层

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

    根据一些数据训练模型

【讨论】:

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

以上是关于model.compile() 是不是初始化 Keras(tensorflow 后端)中的所有权重和偏差?的主要内容,如果未能解决你的问题,请参考以下文章

keras中model.compile()基本用法

是否应该在使用 model.load_weights() 之前运行 model.compile(),如果模型只是稍微改变了说 dropout?

keras中model.compile的参数'weighted_metrics'和model.fit_generator的参数'class_weight'之间的区别?

如何为 binary_crossentropy、activation=sigmoid 和 activation=softmax 指定 model.compile?

keras model.compile(loss='目标函数 ', optimizer='adam', metrics=['accuracy'])(代码

keras 如何处理多重损失?