【问题标题】:CNTK Trainer for multiple OutputsCNTK 多输出训练器
【发布时间】:2019-04-11 03:04:05
【问题描述】:

在 CNTK 有多个 Output Layers 的情况下,一个 Train 是否应该有多个 Trainer?

List<Learner> learnersA = new List<Learner>() { Learner.SGDLearner(OutputLayerOne.Parameters(), learningRate) };
List<Learner> learnersB = new List<Learner>() { Learner.SGDLearner(OutputLayerTwo.Parameters(), learningRate) };

Trainer trainerA = Trainer.CreateTrainer(OutputLayerOne, loss, eval, learnersA);
Trainer trainerB = Trainer.CreateTrainer(OutputLayerTwo, loss, eval, learnersB);

或者有没有更好的方法,使用可以训练多种功能的 Trainer 进行训练?

【问题讨论】:

    标签: c# cntk


    【解决方案1】:

    您似乎有 2 个损失函数。目前在优化领域,只存在优化单个损失函数的技术。对于多任务学习(即多个损失函数),您必须将它们组合成一个损失函数。

    例子:

    loss1 = loss(output1, target1)
    loss2 = loss(output2, target2)
    final_loss = a * loss1 + (1-a) * loss2  # where `a` is the relative importance between the 2 loss.
    

    您还应该确保 2 loss 具有相同的单位,否则将它们组合在一起没有意义。

    【讨论】:

    • 很好的建议,谢谢! +1。正如培训师初始化的那样,我的问题仍未得到解答,因为我有两个输出作为函数,我应该用不同的“培训师”分别训练每个输出吗?
    • 你的输出就是你的损失。你必须像我上面所说的那样组合它们。如果两个输出完全相互独立,那么您应该分别训练它们,但是既然您在问,我怀疑是这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多