【问题标题】:Gradually decay the weight of loss function逐渐衰减损失函数的权重
【发布时间】:2019-05-31 13:03:25
【问题描述】:

我不确定是否适合提出这个问题,如果我需要删除帖子,请随时告诉我。

我是 pyTorch 的新手,目前正在使用 CycleGAN(pyTorch 实现)作为我项目的一部分,并且我了解 cycleGAN 的大部分实现。

我阅读了名为“CycleGAN with better Cycles”的论文,我正在尝试应用论文中提到的修改。修改之一是循环一致性权重衰减,我不知道如何应用。

optimizer_G.zero_grad()

# Identity loss
loss_id_A = criterion_identity(G_BA(real_A), real_A)
loss_id_B = criterion_identity(G_AB(real_B), real_B)

loss_identity = (loss_id_A + loss_id_B) / 2

# GAN loss
fake_B = G_AB(real_A)
loss_GAN_AB = criterion_GAN(D_B(fake_B), valid)
fake_A = G_BA(real_B)
loss_GAN_BA = criterion_GAN(D_A(fake_A), valid)

loss_GAN = (loss_GAN_AB + loss_GAN_BA) / 2

# Cycle consistency loss
recov_A = G_BA(fake_B)
loss_cycle_A = criterion_cycle(recov_A, real_A)
recov_B = G_AB(fake_A)
loss_cycle_B = criterion_cycle(recov_B, real_B)

loss_cycle = (loss_cycle_A + loss_cycle_B) / 2

# Total loss
loss_G =    loss_GAN + 
            lambda_cyc * loss_cycle + #lambda_cyc is 10
            lambda_id * loss_identity #lambda_id is 0.5 * lambda_cyc

loss_G.backward()
optimizer_G.step()

我的问题是如何逐渐衰减循环一致性损失的权重?

在实施此修改方面的任何帮助将不胜感激。

这是来自论文: 循环一致性损失有助于在早期阶段稳定训练,但在后期阶段成为现实图像的障碍。我们建议随着训练进度逐渐衰减循环一致性损失 λ 的权重。但是,我们仍然应该确保 λ 是 不会衰减到 0,因此生成器不会变得不受约束并完全疯狂。

提前致谢。

【问题讨论】:

    标签: python pytorch torchvision


    【解决方案1】:

    下面是你可以使用的原型函数!

    def loss (other params, decay params, initial_lambda, steps):
        # compute loss
        # compute cyclic loss
        # function that computes lambda given the steps
        cur_lambda  = compute_lambda(step, decay_params, initial_lamdba) 
    
        final_loss = loss + cur_lambda*cyclic_loss 
        return final_loss
    

    compute_lambda 函数以 50 步从 10 线性衰减到 1e-5

    def compute_lambda(step, decay_params):
        final_lambda = decay_params["final"]
        initial_lambda = decay_params["initial"]
        total_step = decay_params["total_step"]
        start_step = decay_params["start_step"]
    
        if (step < start_step+total_step and step>start_step):
            return initial_lambda + (step-start_step)*(final_lambda-initial_lambda)/total_step
        elif (step < start_step):
            return initial_lambda 
        else:
            return final_lambda
    # Usage:
    compute_lambda(i, {"final": 1e-5, "initial":10, "total_step":50, "start_step" : 50})    
    

    【讨论】:

    • 感谢原型!但我认为我需要更多关于计算 lambda 的帮助。我将通过添加一些代码来更新我的问题。
    • 您可以通过多种方式逐渐衰减 - 使用对数、逆或任何其他函数。我不知道论文使用的确切格式。如果您能给我更具体的信息,我可以提供帮助
    • 例如,初始值为10,我想在一些epochs假设为50之后,将初始值线性衰减到1e-5这样的小数字。
    • 非常感谢,我想在经过一些步骤后开始衰减。即在 100 个步骤中的前 50 个步骤中固定 lambda,然后对于其余步骤开始线性衰减到 1e-5,我可以使用 if 语句处理固定部分 if i > total_step: return final_lambda + step*(final_lambda-initial_lambda)/ total_step else: return initial_lambda 但我认为你写的公式是错误的,因为 if 语句的输出是这样的 10, 10, 10 到 50(step), 10, 10 然后 -9.99998, -10.333313, -10.666646, ...并且也不以 1e-5 结尾。
    • 非常感谢,这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 2021-02-13
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多