【问题标题】:Switchable and size changing custom loss function in KerasKeras 中可切换和改变大小的自定义损失函数
【发布时间】:2018-07-19 07:29:26
【问题描述】:

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

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(如here),但后来我遇到了y_predy_true 大小不同的问题(在上述情况之间)。

有什么办法吗?

[编辑] 看来我的问题过于简单化了,所以我会在这里尝试更好地解释它:我在同一数据 (X) 上有三个任务。我的数据的每个样本都是一个序列。每个序列要么是正面的,要么是负面的(上面的 0/1 任务 1)。每个否定样本都是 A/B(任务 2)AND 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 AND 33%/ 33%/33# a/b/c。这就是为什么我选择用 3 个输入(X_01,X_AB,X_abc)来训练它,每个输入在其类型和三个输出节点(y_01,y_AB,y_abc)方面都是平衡的。该解决方案在技术上可以编译和运行,但它既不稳定也不有益(性能方面)。这就是为什么我试图让它像上面解释的那样“可切换”。

【问题讨论】:

  • 每个batch_type的形状是什么?
  • 我认为它应该是 int so (1x1)
  • 那么,你将如何识别它是什么类型的批次?
  • 这不是问题。看这里:github.com/keras-team/keras/issues/2121

标签: tensorflow keras loss-function


【解决方案1】:

您引用的链接很旧,它是针对 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) 结合。
这只能通过Functional API of Keras 完成。

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

【讨论】:

  • 感谢您的详细回答。实际上,这正是我正在做的(最终没有组合的 softmax),但它似乎并没有那么好。我编辑了我的问题以更好地反映我的需求。
猜你喜欢
  • 2020-03-02
  • 1970-01-01
  • 2020-12-19
  • 2017-12-18
  • 2020-03-27
  • 1970-01-01
  • 2018-10-28
  • 2017-12-29
  • 2018-11-12
相关资源
最近更新 更多