gpt4 book ai didi

keras - 使用不同的损失函数恢复训练

转载 作者:行者123 更新时间:2023-12-02 11:17:05 25 4
gpt4 key购买 nike

我想实现一个两步学习过程,其中:

  • 使用损失函数 loss_1 预训练几个时期的模型
  • 将损失函数更改为 loss_2并继续微调训练

  • 目前,我的做法是:
    model.compile(optimizer=opt, loss=loss_1, metrics=['accuracy'])
    model.fit_generator(…)
    model.compile(optimizer=opt, loss=loss_2, metrics=['accuracy'])
    model.fit_generator(…)
    请注意,优化器保持不变,只有损失函数发生变化。我想顺利地继续训练,但损失函数不同。根据 this post ,重新编译模型会丢失优化器状态。问题:
    a) 即使我使用相同的优化器,例如 Adam,我会丢失优化器状态吗?
    b) 如果 a) 的答案是肯定的,有没有关于如何在不重置优化器状态的情况下将损失函数更改为新的损失函数的建议?
    编辑:
    根据 Simon Caby 的建议并基于 this thread ,我创建了一个自定义损失函数,其中包含两个依赖于纪元数的损失计算。但是,它对我不起作用。我的做法:
    def loss_wrapper(t_change, current_epoch):
    def custom_loss(y_true, y_pred):
    c_epoch = K.get_value(current_epoch)
    if c_epoch < t_change:
    # compute loss_1
    else:
    # compute loss_2
    return custom_loss
    我编译如下,初始化后 current_epoch :
    current_epoch = K.variable(0.)
    model.compile(optimizer=opt, loss=loss_wrapper(5, current_epoch), metrics=...)
    更新 current_epoch ,我创建了以下回调:
    class NewCallback(Callback):
    def __init__(self, current_epoch):
    self.current_epoch = current_epoch

    def on_epoch_end(self, epoch, logs={}):
    K.set_value(self.current_epoch, epoch)

    model.fit_generator(..., callbacks=[NewCallback(current_epoch)])
    回调更新 self.current_epoch每个时代都正确。但是更新没有达到自定义损失函数。相反, current_epoch永远保持初始化值, loss_2永远不会被执行。
    欢迎任何建议,谢谢!

    最佳答案

    我的回答:
    a) 是的,您可能应该制作自己的学习率调度程序以控制它:

    keras.callbacks.LearningRateScheduler(schedule, verbose=0)

    b) 是的,您可以创建自己的损失函数,包括在两种不同的损失方法之间波动的损失函数。请参阅:“高级 Keras — 构建复杂的自定义损失和度量”
    https://towardsdatascience.com/advanced-keras-constructing-complex-custom-losses-and-metrics-c07ca130a618

    关于keras - 使用不同的损失函数恢复训练,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55406146/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com