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

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

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

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

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

什么时候使用?

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

compile做什么?

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

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

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

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

除非:

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

再次编译的后果:

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

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

收藏
评论

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

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

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

  3. 在顶部添加一些图层

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

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

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

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号