2

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

ce = cross_entropy_with_softmax(model, labels)

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

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

4

3 回答 3

1

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

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

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

import cntk as C
my_bce = label*C.log(model)+(1-label)*C.log(1-model)
于 2017-01-17T17:36:42.283 回答
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))
于 2017-03-31T07:15:41.547 回答
0

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

我们计划重组操作员空间(不破坏向后兼容性)以增加可发现性。

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

于 2017-01-17T10:01:08.163 回答