Keras 中的多任务学习

Adi*_*tya 2 machine-learning neural-network deep-learning keras keras-layer

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


编辑 1: 请注意,所有 3 个 NN 的输入、输出和共享层的所有形状都相同。三个神经网络中有多个共享层(和非共享层)。每个神经网络的着色层都是独一无二的,并且具有相同的形状。

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

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


编辑 2: 基于 geompalik 的有用评论,这就是我最初想出的:

sharedLSTM1 = LSTM((data.shape[1]), return_sequences=True)
sharedLSTM2 = LSTM(data.shape[1])
def createModel(dropoutRate=0.0, numNeurons=40, optimizer='adam'):
    inputLayer = Input(shape=(timesteps, data.shape[1]))
    sharedLSTM1Instance = sharedLSTM1(inputLayer)
    sharedLSTM2Instance =  sharedLSTM2(sharedLSTM1Instance)
    dropoutLayer = Dropout(dropoutRate)(sharedLSTM2Instance)
    denseLayer1 = Dense(numNeurons)(dropoutLayer)
    denseLayer2 = Dense(numNeurons)(denseLayer1)
    outputLayer = Dense(1, activation='sigmoid')(denseLayer2)
    return (inputLayer, outputLayer)

inputLayer1, outputLayer1 = createModel()
inputLayer2, outputLayer2 = createModel()
model = Model(inputs=[inputLayer1, inputLayer2], outputs=[outputLayer1, outputLayer2])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我希望两个模型中的 LSTM 层是共享的,而 dropout 和 2 个密集层是不共享的。那是对的吗?

如果是这样,我不需要keras.layers.concatenate在这个例子中,对吗?

如果我尝试使用可视化网络plot_model(这是我所期望的),我会得到以下图像:

模型图

geo*_*lik 5

使用 Keras 的功能 API 实现所示架构非常简单。 查看此页面以获取更多信息。

在您的情况下,您共享输入层和第一个隐藏层,然后三个主题中的每一个都共享一个层。设计您的模型现在取决于您的数据外观:例如,如果对于给定的输入,您对每个主题都有不同的输出,您应该定义一个模型,如:

model = Model(inputs=[you_main_input], outputs=[subject1_output, subject2_output, subject3_output])
Run Code Online (Sandbox Code Playgroud)

如果不是这种情况,并且您有与每个主题相对应的训练数据,您可以定义三个 NN,并在它们之间共享前两层。检查上述文档中的“共享层”。