複数入力・出力モデルの作成

Kerasで複数の入力や出力を持つモデル(多入力・多出力モデル)を作成する場合、Functional APIを用いるのが一般的です。Sequential APIでは単一の入力・出力しか扱えないため、このような複雑なモデル構造には適していません。

以下では、複数入力・出力モデルの構築方法を、具体的なコード例とともに詳しく解説します。


1. 基本構成

KerasのFunctional APIでは、以下の流れで多入力・多出力モデルを構築します:

  1. 複数のInputレイヤーを定義

  2. 各入力に対して個別に処理を行うレイヤーを定義

  3. 必要に応じて結合(Concatenate)や共有処理を追加

  4. 複数の出力レイヤーを定義

  5. Model(inputs=[...], outputs=[...])で統合


2. コード例:2つの入力と2つの出力を持つモデル

例:顧客情報と購入履歴から、購買確率とユーザータイプを予測するモデル

python
from tensorflow.keras.layers import Input, Dense, Concatenate from tensorflow.keras.models import Model # 入力1:数値ベクトル(顧客属性) input_customer = Input(shape=(10,), name='customer_input') x1 = Dense(32, activation='relu')(input_customer) # 入力2:過去の購入履歴(商品カテゴリごとのフラグ) input_history = Input(shape=(5,), name='history_input') x2 = Dense(16, activation='relu')(input_history) # 結合 merged = Concatenate()([x1, x2]) shared = Dense(64, activation='relu')(merged) # 出力1:購買確率(回帰) output_prob = Dense(1, activation='sigmoid', name='purchase_probability')(shared) # 出力2:ユーザータイプ(分類) output_type = Dense(3, activation='softmax', name='user_type')(shared) # モデルの定義 model = Model(inputs=[input_customer, input_history], outputs=[output_prob, output_type]) # コンパイル model.compile(optimizer='adam', loss={'purchase_probability': 'binary_crossentropy', 'user_type': 'categorical_crossentropy'}, metrics={'purchase_probability': 'accuracy', 'user_type': 'accuracy'})

3. モデルの概要表示

python
model.summary()

これにより、各入力・出力の接続構造が可視化されます。


4. 学習データの準備と学習

学習時は、それぞれの入力・出力に対応するデータを以下のように渡します:

python
# ダミーデータ import numpy as np customer_data = np.random.random((1000, 10)) history_data = np.random.random((1000, 5)) prob_labels = np.random.randint(2, size=(1000, 1)) type_labels = np.random.randint(3, size=(1000, 3)) # ワンホットエンコーディング済み # モデルの学習 model.fit({'customer_input': customer_data, 'history_input': history_data}, {'purchase_probability': prob_labels, 'user_type': type_labels}, epochs=10, batch_size=32)

5. まとめ

  • 複数入力・出力モデルはFunctional APIで柔軟に構築できる。

  • 入力はInput()で複数定義し、処理後に結合や並行処理を行う。

  • 出力も複数定義し、個別の損失関数や評価指標を設定可能。

  • 学習時にはdict形式でデータを渡すことで、入出力を正確にマッピングできる。

生成日:2025/05/22