Kerasでのマルチタスク学習


12

Kerasで共有レイヤーを実装しようとしています。Kerasにはがあることがわかりますがkeras.layers.concatenate、その使用に関するドキュメントからはわかりません。複数の共有レイヤーを作成するために使用できますか?以下に示すように、Kerasを使用して単純な共有ニューラルネットワークを実装する最良の方法は何でしょうか?共有ニューラルネットワーク

3つのNNすべての入力、出力、共有レイヤーの形状はすべて同じであることに注意してください。3つのNNには複数の共有レイヤー(および非共有レイヤー)があります。色付きのレイヤーは各NNに固有であり、同じ形状を持っています。

基本的に、この図は、複数の共有非表示層が続く3つの同一のNNを表し、その後に複数の非共有非表示層が続きます。

Twitterの例のように複数のレイヤーを共有する方法がわかりません。共有レイヤーは1つしかありません(APIドキュメントの例)。

回答:


10

機能的なAPIを使用すると、ネットワークのさまざまな部分で重みを簡単に共有できます。あなたの場合、入力であるがあり、共有というレイヤーがあります。次に、sub1、sub2、sub3という3つの異なるレイヤーがあり、次にout1、out2、out3という3つの出力レイヤーがあります。Input バツDenseDense

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])

これで、各出力に1つずつ、3つの要素のタプル/リストが期待されます。

これらの概念を使用してさらに多くのことができます。個人レイヤーの個々の重みを学習したいが、出力レイヤーへの線形結合に対して同じ重みを保持したい場合、これを行うことでそれを達成できます。

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

編集:連結は基本的にあなたがしたいことの反対です。ネットワークのさまざまな部分の出力を新しいレイヤーに貼り付けます(中間)。実際には、複数の異なる部分に分割する必要があります。


どうもありがとう。を実行するとmodel.fit([data1, data2], [labels1, labels2])、これは単一のモデルとしてトレーニングされます(逆伝播)。
アディティア

1
ラベルに異なる損失が関連付けられている場合、さらに作業を行う必要がありますが、Kerasでは非常に簡単ではありませんが、同じ重み関数を再重み付けせずに共有すると、不可能ではありません
ヤンヴァンデルベクト

これには、統合モデルの再トレーニングが必要になります。サブモデルのトレーニングウェイトが既にある場合はどうなりますか?これらの重みを使用して、マージされたモデルのウィジェットを作成する方法はありますか?
shahar_m

@shahar_m申し訳ありませんが、ユースケースが何であるかわかりません。統合モデルのトレーニングの重みが固定されている場合、それらのレイヤーをロードおよびフリーズできます。
アディティア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.