python CNTK中丢失函数的替代方法

时间:2017-01-16 15:31:52

标签: python deep-learning cntk

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

ce = cross_entropy_with_softmax(model, labels)

如上所述here并且我有多标签分类器,我想使用适当的损失函数。问题是我找不到任何适当的文档来在 Python 中找到这些损失函数。是否有任何关于此要求的建议或示例代码。

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

3 个答案:

答案 0 :(得分:1)

更新(基于以下评论):如果您使用顺序模型,那么您可能有兴趣在每个位置的损失序列中对所有位置求和。 TableView<Item> table = ... ; TableColumn<Item, Integer> valueCol = new TableColumn<>("Value"); valueCol.setCellValueFactory(cellData -> new SimpleIntegerProperty(cellData.getValue().getValue()).asObject()); valueCol.setCellFactory(tc -> new SpinnerTableCell<>(Item::setValue, 1)); 适用于每个位置的损失,CNTK将自动计算序列中所有位置的损失值之和。

请注意,术语cross_entropy_with_softmax在这里是非标准的,因为它通常指的是多个二进制标签的问题。您链接到的Wiki页面指的是与您正在执行的操作不同的情况。

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

Logistic

答案 1 :(得分:1)

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

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

E.g。如果模型函数返回一个三元组(以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 :(得分:0)

目前,大多数运营商都在with RoutesCTE as ( select CAST([From] + '->' + [To] as nvarchar(max)) as [Route] ,0 as TransfersCount ,[From] ,[To] from Routes union all select r.[Route] + '->' + r1.[To] ,TransfersCount + 1 ,r.[From] ,r1.[To] from RoutesCTE r join Routes r1 on r.[To] = r1.[From] and r1.[To] <> r.[From] and PATINDEX('%'+r1.[To]+'%', r.[Route]) = 0 ) select [Route] from RoutesCTE where [From] = 'Los Angeles' and [To] = 'London' and TransfersCount <= 2 包中并记录here。唯一的例外是与序列相关的运算符,它位于cntk.ops中。

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

对于您的特定情况,cntk.ops.sequence似乎是一个合理的选择,您可以使用示例here找到其文档。另请查看此Jupyter Notebook以获取完整示例。