初心者でも迷わない!複雑なKerasモデルの設計図を読み解く秘訣

こんにちは。ゆうせいです。

AIのモデルを組み立てているとき、層が増えたり枝分かれしたりしてくると「今、データはどういう形をしているんだっけ?」と迷子になってしまうことはありませんか。

そんなとき、一瞬で進むべき道を照らしてくれるのがmodel.summaryメソッドです。

今回は、あえて少し複雑なモデルを題材にして、その結果をどう読み解けばいいのか、プロの視点で徹底解説します。

複雑なモデルをあえて作ってみよう

まずは、画像認識などでよく使われる、複数の層を重ねたモデルを用意します。

ただ一本道なだけでなく、データの形がダイナミックに変化する構成にしてみましょう。

from tensorflow import keras
from tensorflow.keras import layers

# 少し複雑なモデルの定義
model = keras.Sequential([
    layers.Input(shape=(64, 64, 3)), # 64x64ピクセルのカラー画像
    layers.Conv2D(32, kernel_size=(3, 3), activation='relu'),
    layers.MaxPooling2D(pool_size=(2, 2)),
    layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),
    layers.Flatten(),
    layers.Dropout(0.5),
    layers.Dense(10, activation='softmax')
])

# 設計図を表示!
model.summary()

このコードを実行すると、画面にパッと以下のような表が出てきます。

Model: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d (Conv2D)                 │ (None, 62, 62, 32)     │           896 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d (MaxPooling2D)    │ (None, 31, 31, 32)     │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_1 (Conv2D)               │ (None, 29, 29, 64)     │        18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten (Flatten)               │ (None, 53824)          │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout (Dropout)               │ (None, 53824)          │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_2 (Dense)                 │ (None, 10)             │       538,250 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 557,642 (2.13 MB)
 Trainable params: 557,642 (2.13 MB)
 Non-trainable params: 0 (0.00 B)

でも、数字が並んでいてどこを見ればいいか戸惑いませんか。

表の読み解き方:3つのチェックポイント

表示された表には、モデルが正しく動くための「ヒント」が隠されています。

1. Layer (type) と名前のルール

左端には層の種類が表示されます。

注目してほしいのは、カッコ内の名前です。

これはKerasが自動で付けた名前ですが、自分で layers.Dense(10, name='my_output') のように名前を指定することもできます。

複雑なモデルになればなるほど、名前にこだわると設計図が読みやすくなりますよ。

2. Output Shape:データの「ダイエット」を追え

ここが一番の重要ポイントです。

例えば、最初は (None, 64, 64, 3) だったものが、途中で (None, 31, 31, 32) になったり、Flatten(フラッテン)という層を通った瞬間に (None, 57600) のような巨大な一列の数字に変わったりします。

ここで専門用語の解説です。

Flattenとは、日本語で「平滑化」と言います。

2次元の画像データを、1列に並んだ長いデータに作り替える作業のことです。

例えるなら、綺麗に詰められた「たこ焼きの箱」を開けて、中のたこ焼きを全部一列に並べ直すようなものですね。

これにより、最後の全結合層(Dense層)で分類ができるようになります。

あなたは、データが途中で消えてしまったり、逆に膨らみすぎていたりしないか、この列で確認できていますか。

3. Param #:学習する力の正体

右端の数字は、AIが学習する「重みの数」です。

例えば、Conv2D(畳み込み層)のパラメータ数は以下の数式で計算されます。

Param = ( フィルターの幅 \times フィルターの高さ \times 入力チャンネル数 + 1 ) \times フィルターの枚数

計算してみると、意外と大きな数字になりませんか。

特に最後のDense層(全結合層)では、前の層の全てのデータと繋がるため、パラメータ数が爆発的に増えることがあります。

これが多すぎると、AIが「丸暗記(過学習)」を始めてしまい、新しいデータに弱くなってしまうので注意が必要です。

メリットとデメリット

メリット

  • 接続ミスを防げる:入力と出力の形が合わずにエラーが出る前に、どこがおかしいか特定できます。
  • メモリ使用量の目安になる:総パラメータ数を見れば、スマホで動くのか、高性能なサーバーが必要なのかが分かります。

デメリット

  • 構造が深すぎると読みにくい:100層を超えるようなモデルだと、表が長くなりすぎて全体を把握しづらくなります。
  • データの「値」は見えない:あくまで形(Shape)を見せるものなので、中でどんな数字が流れているかはデバッグが必要です。

まとめと今後のステップ

model.summaryは、AIエンジニアにとっての「コンパス」です。

これを見ながら、データの形がどう変化し、どこで多くの学習が行われているのかをイメージする癖をつけてください。

次は、モデルを画像として書き出す keras.utils.plot_model という機能に挑戦してみるのはいかがでしょうか。

表形式ではなく、実際の図として流れを見ることができるので、より直感的に理解が深まりますよ。

自分の作ったモデルが、あなたの想像通りに「ダイエット」や「変身」を繰り返していましたか。

もっと深く、特定の層の計算方法について知りたくなったら、いつでも教えてください。

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。