【发布时间】: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_pred 和y_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