Keras中的多任务学习


12

我正在尝试在Keras中实现共享层。我确实看到Keras拥有keras.layers.concatenate,但是我从文档中不确定其用法。我可以使用它来创建多个共享层吗?如下所示,使用Keras来实现简单的共享神经网络的最佳方法是什么?共享神经网络

请注意,所有3个NN的输入,输出和共享层的所有形状都相同。三个NN中有多个共享层(和非共享层)。着色层对于每个NN都是唯一的,并且具有相同的形状。

基本上,该图表示具有多个共享隐藏层的3个相同的NN,然后是多个非共享隐藏层。

我不确定如何像Twitter示例中那样共享多个层,只有一个共享层(API文档中的示例)。

Answers:


10

通过使用功能性API,您可以轻松地在网络的不同部分之间共享权重。在您的情况下,我们有一个作为输入,那么我们将有一个称为shared 的图层。然后我们将有三个不同的层,分别称为sub1,sub2和sub3,然后是三个输出层,分别为out1,out2和out3。Input xDenseDense

x = Input(shape=(n, ))
shared = Dense(32)(x)
sub1 = Dense(16)(shared)
sub2 = Dense(16)(shared)
sub3 = Dense(16)(shared)
out1 = Dense(1)(sub1)
out2 = Dense(1)(sub2)
out3 = Dense(1)(sub3)

我们现在可以这样定义模型:

model = Model(inputs=x, outputs=[out1, out2, out3])

它将期望现在有三个元素的元组/列表,每个输出一个。

这些概念可以使您走得更远。假设我们想学习人员层的各个权重,但仍然希望对输出层的线性组合具有相同的权重,我们可以通过执行以下操作来实现:

out = Dense(1)
out1 = out(sub1)
out2 = out(sub2)
out3 = out(sub3)

编辑:串联基本上是您想要做的相反,它将网络的不同部分的输出(中间)粘贴到新层中。您实际上想拆分成多个不同的部分。


非常感谢。当我们做一个时model.fit([data1, data2], [labels1, labels2]),它将被训练(反向传播)成一个模型,对吗?
Aditya

1
是的,这只是一回事,如果标签具有不同的损失,您将需要做更多的工作,这在Keras中并不是一件容易的事,但并非没有可能,如果它们共享相同的损失函数而无需重新加权,那是开箱即用的
Jan Van der Vegt

这将需要重新训练统一模型。如果您已经具有子模型的训练权重怎么办?有没有办法使用这些权重为合并的模型创建维权?
shahar_m

@shahar_m对不起,我不确定用例是什么。如果统一模型的训练权重固定,则可以加载和冻结这些层。
Aditya
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.