0

我正在研究一个多任务多标签分类器,所有这些都应该在同一个网络中完成(共享权重)。我想以以下可切换的方式训练网络:

if batch_type=1 => train with data minibatch X and labels of size (batchsize,**2**) (labels: 0/1)  

if batch_type=2 => train with data minibatch X and labels of size (batchsize,**2**) (labels: A/B)

if batch_type=3 => train with data minibatch X and labels of size (batchsize,**3**) (labels: a/b/c) 

我知道我可以实现一个自定义损失函数并在其中包含 K.switch (就像这里),但后来我遇到了不同大小的问题y_predy_true(在上述情况之间)。

任何想法如何做到这一点?

[编辑]似乎我的问题过于简单化了,所以我会在这里尝试更好地解释它:我在同一数据(X)上有三个任务。我的数据的每个样本都是一个序列。每个序列要么是正面的,要么是负面的(上面的 0/1 任务 1)。每个样本是 A/B(任务 2)a/b/c(任务 3)。为了一起训练系统(假设它将从共享 wights 中受益),我可以引入单个输入 X 和单个组合 softmax (0Aa,0Ab,...) 或 3 个分离的 softmax 层 (0/1,A/ B,a/b/c)。在这两种情况下,很难平衡我的单个 minibatch X 有 50%/50% 0/1 AND 50%/50% A/B AND33%/33%/33# a/b/c。这就是为什么我选择用 3 个输入(X_01,X_AB,X_abc)来训练它,每个输入在其类型和三个输出节点(y_01,y_AB,y_abc)方面都是平衡的。该解决方案在技术上可以编译和运行,但它既不稳定也不有益(性能方面)。这就是为什么我试图让它“可切换”,就像我上面解释的那样。

4

1 回答 1

0

您引用的链接非常旧,它适用于 Keras 1.0。现在我们处于 2.1.3,这将对那个老问题给出完全不同的答案。我只是简单地扫描了纸张,但看不到提到的不同输出形状。

在当前版本的 Keras 中,任何层的输出大小都是模型级别的设置。这意味着不可能按照您计划的方式去做您要求的事情。

然而,它可以通过使用香草 Keras 来实现。
你可以像这样组合你的输出 [0Aa, 0Ab, ..., 1Bb, 1Bc]
然后你可以构建一个DAG,最后有一个合并的密集层。
第一个塔应该返回 [0/1],第二个 [A/B],第三个 [a/b/c]。如果需要,可以共享层,这样只有输出层需要不同。最后一层应该是每个塔的 softmax,形状为 2、2、3,以便与您的类型相对应。应使用 3 个辅助输出来保持对 3 个塔的训练控制。
然后你可以放置一个最终的 softmax 层来与形状 12 (2 x 2 x 3 = 12) 结合。
这只能通过Keras 的功能 API来完成。

这样您就可以在 Keras 中构建任何多标签分类器

于 2018-02-08T23:10:29.540 回答