Keras 中的多任务学习
Multi task learning in Keras
我正在尝试在 Keras 中实现共享层。我确实看到 Keras 有 keras.layers.concatenate
,但我不确定它的使用文档。我可以用它来创建多个共享层吗?使用 Keras 实现如下所示的简单共享神经网络的最佳方法是什么?
编辑 1:
请注意,所有 3 个 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 层是共享的,而 dropout 和 2 个密集层是不共享的。对吗?
如果是这样,我在这个例子中不需要keras.layers.concatenate
,对吧?
如果我尝试使用 plot_model
可视化网络(这正是我所期待的),我会得到以下图像:
使用 Keras 的功能 API 实现所示架构非常简单。 Check this page 了解更多信息。
在您的情况下,您共享了输入层和第一个隐藏层,然后为三个主题中的每一个共享了一层。设计模型现在取决于数据的外观:例如,如果对于给定的输入,每个主题都有不同的输出,您应该定义一个模型,如:
model = Model(inputs=[you_main_input], outputs=[subject1_output, subject2_output, subject3_output])
如果不是这种情况,并且您有与每个主题相对应的训练数据,您可以定义三个神经网络,并让它们共享前两层。在上面引用的文档中检查 "Shared layers"。
我正在尝试在 Keras 中实现共享层。我确实看到 Keras 有 keras.layers.concatenate
,但我不确定它的使用文档。我可以用它来创建多个共享层吗?使用 Keras 实现如下所示的简单共享神经网络的最佳方法是什么?
编辑 1: 请注意,所有 3 个 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 层是共享的,而 dropout 和 2 个密集层是不共享的。对吗?
如果是这样,我在这个例子中不需要keras.layers.concatenate
,对吧?
如果我尝试使用 plot_model
可视化网络(这正是我所期待的),我会得到以下图像:
使用 Keras 的功能 API 实现所示架构非常简单。 Check this page 了解更多信息。
在您的情况下,您共享了输入层和第一个隐藏层,然后为三个主题中的每一个共享了一层。设计模型现在取决于数据的外观:例如,如果对于给定的输入,每个主题都有不同的输出,您应该定义一个模型,如:
model = Model(inputs=[you_main_input], outputs=[subject1_output, subject2_output, subject3_output])
如果不是这种情况,并且您有与每个主题相对应的训练数据,您可以定义三个神经网络,并让它们共享前两层。在上面引用的文档中检查 "Shared layers"。