入出力が複雑なネットワークの定義

Kerasにおいて入出力が複雑なネットワーク(例えばマルチインプット・マルチアウトプットのモデルや分岐・統合を伴うモデル)を定義する場合、Sequential API ではなく、Functional API を使用するのが一般的です。Functional APIは、複雑なネットワーク構造を柔軟に記述することができるため、多様な構造を持つモデルの定義に適しています。


1. Functional APIの基本構造

python
from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, Dense, Concatenate

入力定義

python
input1 = Input(shape=(32,)) input2 = Input(shape=(64,))

ネットワーク構築

python
x1 = Dense(64, activation='relu')(input1) x2 = Dense(64, activation='relu')(input2)

中間層の統合(例えば結合)

python
merged = Concatenate()([x1, x2])

出力定義(マルチアウトプットも可能)

python
output1 = Dense(1, activation='sigmoid')(merged) output2 = Dense(10, activation='softmax')(merged)

モデルの定義

python
model = Model(inputs=[input1, input2], outputs=[output1, output2])

2. 複雑なネットワーク例

例1:マルチインプット・マルチアウトプットモデル

python
from tensorflow.keras.layers import Dropout input_text = Input(shape=(100,)) input_metadata = Input(shape=(10,)) x_text = Dense(64, activation='relu')(input_text) x_text = Dropout(0.5)(x_text) x_meta = Dense(32, activation='relu')(input_metadata) x = Concatenate()([x_text, x_meta]) x = Dense(64, activation='relu')(x) output_class = Dense(1, activation='sigmoid', name='class_output')(x) output_score = Dense(1, activation='linear', name='score_output')(x) model = Model(inputs=[input_text, input_metadata], outputs=[output_class, output_score])

この例では、テキスト特徴量とメタデータを別々に処理し、それらを統合した後、分類と回帰の2つの出力を得ています。


3. Functional APIの利点

  • 分岐や並列処理が可能:層の出力を複数の層へ分岐させることができる。

  • マルチインプット・マルチアウトプット対応:異なる種類の入力・出力に対して個別に処理が可能。

  • 柔軟性が高い:Residual Network、Attention、マルチモーダル処理なども記述可能。


4. モデルの可視化と確認

python
model.summary()

または

python
from tensorflow.keras.utils import plot_model plot_model(model, to_file='model.png', show_shapes=True)

これにより、複雑な構造を視覚的に確認できます。


まとめ

Kerasにおいて入出力が複雑なモデルを構築する場合、Functional API を使用することで、入力や出力の分岐、統合、複数出力などの設計が柔軟に可能です。実運用の現場では、このような構造が必要になることが多いため、Functional APIの習得は非常に重要です。必要に応じて、カスタムレイヤーやサブクラス化も組み合わせて拡張することができます。

生成日:2025/05/22