我在 CNTK 中创建了一个顺序模型,并将这个模型传递给如下的损失函数:
ce = cross_entropy_with_softmax(model, labels)
正如这里提到的,因为我有多标签分类器,我想使用适当的损失函数。问题是我找不到任何合适的文档来在Python中找到这些损失函数。对此要求是否有任何建议或示例代码。
我应该注意到我在 BrainScript 语言中找到了这些替代方案(逻辑和加权逻辑),但在Python中没有。
我在 CNTK 中创建了一个顺序模型,并将这个模型传递给如下的损失函数:
ce = cross_entropy_with_softmax(model, labels)
正如这里提到的,因为我有多标签分类器,我想使用适当的损失函数。问题是我找不到任何合适的文档来在Python中找到这些损失函数。对此要求是否有任何建议或示例代码。
我应该注意到我在 BrainScript 语言中找到了这些替代方案(逻辑和加权逻辑),但在Python中没有。
更新(基于下面的评论):如果您使用的是顺序模型,那么您可能有兴趣对每个位置的损失序列中的所有位置求和。cross_entropy_with_softmax
适用于每个位置的损失,CNTK 将自动计算序列中所有位置的损失值的总和。
请注意,multilabel
这里的术语是非标准的,因为它通常指的是多个二进制标签的问题。您链接到的 wiki 页面指的是与您正在做的不同的案例。
原始答案(对实际的多标签情况有效):您将需要使用binary_cross_entropy或weighted_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)
“我的数据有多个标签(三个标签),每个标签有两个以上的值(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))
目前,大多数操作员都在cntk.ops
包中并在此处记录。唯一的例外是与序列相关的运算符,它们位于cntk.ops.sequence
.
我们计划重组操作员空间(不破坏向后兼容性)以增加可发现性。
对于您的特定情况,cross_entropy_with_softmax
这似乎是一个合理的选择,您可以在此处找到带有示例的文档。另请查看此Jupyter Notebook以获取完整示例。