Keras中的可切换和尺寸改变自定义损失功能

时间:2018-02-08 16:33:47

标签: tensorflow keras loss-function

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

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_pred和{{1}不同大小的问题(在上述案例之间)。

任何想法怎么做?

[编辑]我似乎过度简化了我的问题,所以我将在这里尝试更好地解释它:我对同一数据(X)有三个任务。我的数据的每个样本都是一个序列。每个序列是正面的或负面的(上面的0/1任务1)。每个否定样本都是A / B(任务2) AND a / b / c(任务3)。为了训练系统(假设它将从共享权利中受益),我可以引入单个输入X和单个组合softmax(0Aa,0Ab,...)或3个分离的softmax层(0/1,A / b,A / b / C)。在这两种情况下,我很难平衡我的单个小批量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)方面是平衡的。这种解决方案在技术上可以编译和运行,但它既不稳定也不有益(性能明智)。这就是为什么我试图让它像上面解释的那样“可切换”。

1 个答案:

答案 0 :(得分: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)组合 这只能通过Functional API of Keras完成。

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