我正在研究一个多任务多标签分类器,所有这些都应该在同一个网络中完成(共享权重)。我想以以下可切换的方式训练网络:
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_pred
和y_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)方面都是平衡的。该解决方案在技术上可以编译和运行,但它既不稳定也不有益(性能方面)。这就是为什么我试图让它“可切换”,就像我上面解释的那样。