我在CNTK中创建了一个顺序模型,并将此模型传递给如下所示的损失函数:
ce = cross_entropy_with_softmax(model, labels)
如上所述here并且我有多标签分类器,我想使用适当的损失函数。问题是我找不到任何适当的文档来在 Python 中找到这些损失函数。是否有任何关于此要求的建议或示例代码。
我应该注意到我在BrainScript语言中找到了这些替代方案(逻辑和加权逻辑),但在 Python 中没有。
答案 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_entropy或multilabel
。 (我们决定在将其移植到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以获取完整示例。