机器学习中的多标签/多任务/多类回归

时间:2017-11-23 10:09:27

标签: tensorflow keras

我的挑战是训练神经网络识别不同类别任务的某些动作和事件,或者在给定输入的情况下如何调用它。 我看到训练神经网络时的大部分输入/输出都是0或1或[0,1]。但在我的场景中,我希望我的输入采用整数形式,这些整数是任意大的,并且输出会有相同的形式。

我举个例子: 输入

X = [ 23, 4, 0, 1233423, 1, 0, 0] ->
Y = [ 2, 1, 1]

现在X [i]中的每个元素代表同一实体的不同属性。 让我们说它想描述一个人:

23 -> maps to a place he/she was born
4 -> maps to a school they graduated 

另一方面,Y [i]中的每个条目意味着人类更有可能在3个不同的类别中做(在这种情况下,len(Y)为3):

Y[0] = 2 -> maps to eating icecream ( from a variety of other choices )
Y[1] = 1 -> maps to a time of day moment ( morning, noon, afternoon, evening, etc...)
Y[2] = 1 -> maps to a day of the week for example

当然,如果任务只是一个多标签问题,我会在输出层上应用sigmoid并执行binary_crossentropy作为丢失函数,但这当然不起作用。 这是因为我的输出显然不在[0,1]之间。 此外,我不确定应用什么损失函数,因为我希望正确预测Y中的所有类/子类。我基本上说的是每个Y [i]本身就是它自己的一类。 如果我的输出形状为(3, labels_per_class),那将更准确 并且损失函数将计算3个不同类别中的每一个的损失 尝试以这样的方式优化结果,即3个类中的每一个都具有正确的标签。 我不确定这是否可能或至少如何。

我真的还在我的神经网络知识和学习的开始,所以很清楚我正在努力解决这个问题。

但实际上更简单地说,我更好地了解如何描述它。它或多或少像自动编码器,但输入和输出是整数。不同之处在于,在我的情况下,输出的大小与自动编码器中的输入大小不同。

我的解决方案是在输出层应用relu(当然还有relu-like activations在所有其他层上)和binary_crossentropy作为丢失函数,但网络的准确性非常低,大约15%。

1 个答案:

答案 0 :(得分:1)

对于标准分类,您可能会执行一个密集层,其中许多节点等于类的数量,然后应用softmax。损失将是tf.losses.softmax_cross_entropy。如果你想允许多个类而不只是一个类,你会做一个sigmoid。

现在您有多个分类任务。一种方法是采用最后一个隐藏层(在你做softmax的那一层之前)。对于每个任务,执行具有多个节点的密集层等于该任务的类数并应用softmax。要计算损失,只需将损失加在一起。

如果任务太不相同,您可能希望每个预测都有多个图层。

你也可以对不同的损失加权,例如,吃冰淇淋比获得正确的时间更重要。

如果预测空间是连续的,则仅使用relu。说时间是连续的,但选择吃冰淇淋,上班,看电视之间的选择不是。如果你使用relu使用像L1(tf.losses.absolut_difference)或L2(tf.losses.mean_squared_error)这样的损失。