Kerasで2つの異なるモデルをマージする


25

2つのKerasモデルを1つのモデルにマージしようとしていますが、これを達成できません。

たとえば、添付の図では、次元8の中間層を取得し、これをモデル(再び次元8の)層への入力として使用し、モデルとモデル両方を単一のモデル。A2B1BAB

機能モジュールを使用して、モデルとモデル個別に作成しています。どうすればこのタスクを達成できますか?AB

:はモデル入力層であり、はモデル入力層です。A1AB1B

写真を見る

回答:


22

私は自分の質問に対する答えを見つけ出しました。これが上記の答えに基づいたコードです。

from keras.layers import Input, Dense
from keras.models import Model
from keras.utils import plot_model

A1 = Input(shape=(30,),name='A1')
A2 = Dense(8, activation='relu',name='A2')(A1)
A3 = Dense(30, activation='relu',name='A3')(A2)

B2 = Dense(40, activation='relu',name='B2')(A2)
B3 = Dense(30, activation='relu',name='B3')(B2)

merged = Model(inputs=[A1],outputs=[A3,B3])
plot_model(merged,to_file='demo.png',show_shapes=True)

そして、これが私が欲しかった出力構造です:

ここに画像の説明を入力してください


上記の2つのモデルを(kerasモデルの意味で)マージするのではなく、レイヤーをマージしていることに注意してください。
gented

7

Kerasには、モデルを定義する便利な方法があります:機能的なAPIを使用します。機能的なAPIを使用すると、レイヤの有向非循環グラフを定義でき、完全に任意のアーキテクチャを構築できます。あなたの例を考えてみましょう:

#A_data = np.zeros((1,30))
#A_labels = np.zeros((1,30))
#B_labels =np.zeros((1,30))

A1 = layers.Input(shape=(30,), name='A_input')
A2 = layers.Dense(8, activation='???')(A1)
A3 = layers.Dense(30, activation='???', name='A_output')(A2)


B2 = layers.Dense(40, activation='???')(A2)
B3 = layers.Dense(30, activation='???', name='B_output')(B2)

## define A
A = models.Model(inputs=A1, outputs=A3)

## define B
B = models.Model(inputs=A1, outputs=B3) 

B.compile(optimizer='??',
          loss={'B_output': '??'}
          )

B.fit({'A_input': A_data},
  {'B_output': B_labels},
  epochs=??, batch_size=??)

だから、それだけです!結果は次の方法で確認できますB.summary()

Layer (type)                 Output Shape              Param    
A_input (InputLayer)         (None, 30)                0         
_________________________________________________________________
dense_8 (Dense)              (None, 8)                 248     
______________________________________________________________
dense_9 (Dense)              (None, 40)                360       
_________________________________________________________________
B_output (Dense)             (None, 30)                1230      

答えてくれてありがとう。しかし、上記のコードがうまくいくとは思わない。まず、B = models.Model(inputs = A2、outputs = B3)と言うと、TypeError:Input layers to a Modelmust be InputLayerobjectsです。受信した入力:テンソル。また、前述のように、機能APIを使用してモデルAとモデルBを別々に作成しました。私が探している答えは、連結関数を使用しているkerasドキュメントの「多入力および多出力モデル」のセクションに関係しているのではないかと思います(完全にはわかりません)。
Rkz

@Rkz:答えを編集しました。今は動作します。「連結」を使用する必要があります。実際、モデル "B"を定義する場合は、メイン入力(A1)に言及する必要があります。
moh

お時間と編集をありがとう。Kerasのドキュメントから答えを見つけました(次の答えを参照)。私は質問に連結を必要としませんでした。
Rkz

@Rkz:最終編集を見て、モデルをコンパイルしてフィットさせる方法も示します。
moh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.