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

Pre*_*rko 42 keras tensorflow

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

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

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

Dan*_*ler 85

什么时候用?

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

怎么load_model办?

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

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

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

你需要多次使用编译吗?

除非:

  • 您想要更改其中一个:
    • 损失功能
    • 优化/学习率
    • 度量
  • 您加载(或创建)尚未编译的模型.或者您的加载/保存方法不考虑以前的编译.

再次编译的后果:

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

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

  • 没有什么变化。编译就是给“训练”设置“优化器”和“损失”函数,仅此而已。如果您想加载模型并且不训练它,则不需要编译它。1 - `compile=True`:模型将使用保存时相同的设置进行加载和编译。2 - `compile=False`,您将仅加载没有优化器的模型。 (2认同)

tod*_*day 15

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

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

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

  3. 在顶部添加一些图层

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

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

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

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

  • @Kake_Fisk 更改不会有效,即该层的可训练性状态将保持在最后一次“compile”方法调用之前的状态。 (3认同)
  • 更改层的可训练标志后不编译模型会产生什么结果? (2认同)