初心者でも迷わない!複雑な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(畳み込み層)のパラメータ数は以下の数式で計算されます。
計算してみると、意外と大きな数字になりませんか。
特に最後のDense層(全結合層)では、前の層の全てのデータと繋がるため、パラメータ数が爆発的に増えることがあります。
これが多すぎると、AIが「丸暗記(過学習)」を始めてしまい、新しいデータに弱くなってしまうので注意が必要です。
メリットとデメリット
メリット
- 接続ミスを防げる:入力と出力の形が合わずにエラーが出る前に、どこがおかしいか特定できます。
- メモリ使用量の目安になる:総パラメータ数を見れば、スマホで動くのか、高性能なサーバーが必要なのかが分かります。
デメリット
- 構造が深すぎると読みにくい:100層を超えるようなモデルだと、表が長くなりすぎて全体を把握しづらくなります。
- データの「値」は見えない:あくまで形(Shape)を見せるものなので、中でどんな数字が流れているかはデバッグが必要です。
まとめと今後のステップ
model.summaryは、AIエンジニアにとっての「コンパス」です。
これを見ながら、データの形がどう変化し、どこで多くの学習が行われているのかをイメージする癖をつけてください。
次は、モデルを画像として書き出す keras.utils.plot_model という機能に挑戦してみるのはいかがでしょうか。
表形式ではなく、実際の図として流れを見ることができるので、より直感的に理解が深まりますよ。
自分の作ったモデルが、あなたの想像通りに「ダイエット」や「変身」を繰り返していましたか。
もっと深く、特定の層の計算方法について知りたくなったら、いつでも教えてください。
セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。
最新の投稿
新人エンジニア研修講師2026年2月24日機械学習に登場する記号に強くなろう
新人エンジニア研修講師2026年2月24日80対20の法則で成果を最大化!パレートの法則とベキ分布の不思議な関係
新人エンジニア研修講師2026年2月24日迷惑メール判定の舞台裏:ロジットが切り分ける「シロ」と「クロ」の境界線
新人エンジニア研修講師2026年2月24日AIが「想像」する力を手に入れる仕組み:変分オートエンコーダーの秘密