Keras的多任务学习

时间:2018-02-05 02:13:20

标签: machine-learning neural-network deep-learning keras keras-layer

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

编辑1: 请注意,所有3个NN的输入,输出和共享层的所有形状都是相同的。三个NN中有多个共享层(和非共享层)。有色层对于每个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'])

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

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

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

model plot

1 个答案:

答案 0 :(得分:2)

使用Keras的功能API实现所示的体系结构非常简单。 Check this page了解更多相关信息。

在您的情况下,您将输入图层和第一个隐藏图层共享,然后为三个主题中的每一个创建一个图层。现在,设计模型的方式与数据的外观有关:例如,如果对于给定的输入,每个主题的输出都不同,则可以定义如下模型:

model = Model(inputs=[you_main_input], outputs=[subject1_output, subject2_output, subject3_output])

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