【问题标题】:Alternatives for loss functions in python CNTKpython CNTK中损失函数的替代方案
【发布时间】:2017-01-16 15:31:52
【问题描述】:

我在 CNTK 中创建了一个顺序模型,并将该模型传递给如下的损失函数:

ce = cross_entropy_with_softmax(model, labels)

正如提到的here 和我有多标签分类器,我想使用适当的损失函数。问题是我找不到任何合适的文档来在 Python 中找到这些损失函数。是否有针对此要求的任何建议或示例代码。

我应该注意到,我在 BrainScript 语言中找到了这些替代方案(逻辑和加权逻辑),但在 Python 中没有。

【问题讨论】:

    标签: python deep-learning cntk


    【解决方案1】:

    “我的数据有多个标签(三个标签),每个标签有两个以上的值(30个不同的值)”

    我是否理解正确,您有 3 个网络输出和相关标签,每个都是 1-in-30 分类器?然后看来您可以添加三个 cross_entropy_with_softmax() 值。这就是你想要的吗?

    例如如果模型函数返回一个三元组(以 return combine([z1, z2, z3]) 之类的结尾),那么您传递给 Trainer 的标准函数可能如下所示(如果您不使用 Python 3,则语法略有不同):

    from cntk.layers.typing import Tensor, SparseTensor
    @Function
    def my_criterion(input : Tensor[input_dim], labels1 : SparseTensor[30],
                     labels2 : SparseTensor[30], labels3 : SparseTensor[30]):
        z1, z2, z3 = my_model(input).outputs
        loss = cross_entropy_with_softmax(z1, labels1) + \
               cross_entropy_with_softmax(z2, labels2) + \
               cross_entropy_with_softmax(z3, labels3)
        return loss
    
    learner = ...
    trainer = Trainer(None, my_criterion, learner)
    
    # in MB loop:
    input_mb, L1_mb, L2_mb, L3_mb = my_next_minibatch()
    trainer.train_minibatch(my_criterion.argument_map(input_mb, L1_mb, L2_mb, L3_mb))
    

    【讨论】:

      【解决方案2】:

      更新(基于下面的 cmets):如果您使用的是顺序模型,那么您可能有兴趣对每个位置的损失序列中的所有位置求和。 cross_entropy_with_softmax 适用于每个位置的损失,CNTK 将自动计算序列中所有位置的损失值之和。

      请注意,术语multilabel 在这里是非标准的,因为它通常指的是多个二进制标签的问题。您链接到的 wiki 页面指的是与您正在做的不同的案例。

      原始答案(对实际的多标签案例有效):您将需要使用binary_cross_entropyweighted_binary_cross_entropy。 (我们决定在将其移植到 Python 时重命名 Logistic)。在撰写本文时,这些操作仅支持 {0,1} 标签。如果您的标签在 (0,1) 中,那么您需要像这样定义损失

      import cntk as C
      my_bce = label*C.log(model)+(1-label)*C.log(1-model)
      

      【讨论】:

      • 我想要多标签分类器,而不是二元分类器!
      • 我们不区分具有单个二进制标签和许多二进制标签。以上应该可以工作。
      • 很多二进制标签是什么意思?!我说的是多标签分类器,这意味着我的数据有多个标签(三个标签),每个标签有两个以上的值(30 个不同的值)。因此,我的问题是cross_entropy_with_softmax 在这些情况下是否有效?
      • 感谢您的澄清。我已经基于此更新了我的答案。我认为您现在会发现它对您的情况更有用。
      【解决方案3】:

      目前,大多数运算符都在 cntk.ops 包中,并记录在 here 中。唯一的例外是与序列相关的运算符,它们位于cntk.ops.sequence

      我们计划重组运算符空间(不破坏向后兼容性)以提高可发现性。

      对于您的特定情况,cross_entropy_with_softmax 似乎是一个合理的选择,您可以通过示例here 找到它的文档。另请查看此Jupyter Notebook 以获取完整示例。

      【讨论】:

      • 我知道cross_entropy_with_softmax,正如我所提到的。我也看过笔记本。但是,我找不到解决方案。您能否从您的链接中复制一个示例,该示例适用于模型和标签,例如我的 cross_entropy_with_softmax 示例?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 2014-03-08
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      相关资源
      最近更新 更多