【Keras実験】Dropoutの効果を比較!過学習を防ぐ方法とは?

2025年6月1日日曜日

Dropout Google Colab Keras 過学習 画像分類

X f B! P L
Dropoutはなぜ必要?効果を実験で見てみよう アイキャッチ画像

はじめに|Dropoutの効果をKerasとMNISTで検証しよう

こんにちは、SHOUです。

ディープラーニングでは、学習が進むにつれてモデルが訓練データに過剰に適応してしまい、「過学習(オーバーフィッティング)」が発生することがあります。

この問題を軽減するための代表的な手法が Dropout(ドロップアウト) です。本記事では、KerasとMNISTを用いて、Dropoutの有無によるCNNモデルの学習性能の違いを可視化・比較していきます。

Dropoutとは?|過学習を防ぐための正則化テクニック

Dropoutは、ニューラルネットワークの学習時に、一時的にランダムに一部のノードを無効化する正則化手法です。

  • 過学習を防止:同じノードに依存しすぎることを防ぐ
  • 汎化性能が向上:未知のデータへの対応力が高まる
  • 訓練時のみ有効:推論時は全ノードを使用するため、性能を損なわない

深層学習において、特に全結合層にDropoutを加えるのは非常に効果的です。

MNIST手書き数字データセットの準備|前処理も紹介

本実験では、ディープラーニングの定番データセット「MNIST」を使用します。

これは、0〜9の数字が手書きされた白黒画像(28×28ピクセル)で構成されており、画像分類の入門として最適です。

from tensorflow import keras

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train / 255.0
x_test = x_test / 255.0
x_train = x_train[..., None]
x_test = x_test[..., None]

この前処理により、ピクセル値を正規化し、CNNに適した形状(28×28×1)に整えます。

DropoutなしのCNNモデル構築|Kerasで過学習の兆候を探る

まずはDropoutを使わない基本的なCNNモデルを構築します。

この構成は、Conv2D → MaxPooling → Flatten → Denseという、画像分類でよく用いられるシンプルなアーキテクチャです。

全体の流れ:

  1. 畳み込み層で特徴抽出
  2. プーリングで特徴マップを縮小
  3. 全結合層で分類処理
from tensorflow.keras import layers

model_no_dropout = keras.Sequential([
    layers.Input(shape=(28, 28, 1)),
    layers.Conv2D(32, 3, activation='relu'),
    layers.MaxPooling2D(),
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dense(10, activation='softmax')
])

model_no_dropout.compile(optimizer='adam',
                         loss='sparse_categorical_crossentropy',
                         metrics=['accuracy'])

history_no_dropout = model_no_dropout.fit(
    x_train, y_train, validation_split=0.2, epochs=20
)

Dropoutなしのこのモデルが、過学習にどのように影響を受けるかを後ほど確認します。

DropoutありのCNNモデル構築|Kerasで汎化性能を高める

次に、過学習を防止するためのDropout層を組み込んだCNNモデルを構築します。

layers.Dropout(0.5) によって、訓練中にランダムに50%のノードを無効化します。

  • Dropout率 0.5:過剰な適合を防ぎ、学習の多様性を確保
  • 推論時にはDropoutは無効化され、全ノードが利用されます
from tensorflow.keras import layers

model_with_dropout = keras.Sequential([
    layers.Input(shape=(28, 28, 1)),
    layers.Conv2D(32, 3, activation='relu'),
    layers.MaxPooling2D(),
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dropout(0.5),  # ★ Dropout 層を追加
    layers.Dense(10, activation='softmax')
])

model_with_dropout.compile(optimizer='adam',
                           loss='sparse_categorical_crossentropy',
                           metrics=['accuracy'])

history_with_dropout = model_with_dropout.fit(
    x_train, y_train, validation_split=0.2, epochs=20
)

Dropoutありのモデルが過学習にどう影響するかを、次の章で比較検証します。

Dropoutの効果を可視化|精度・損失グラフで比較分析

Dropoutあり・なしのモデルで、訓練精度・検証精度および損失関数の推移を可視化します。

これにより、Dropoutが過学習にどう影響するかを明確に確認できます。

import matplotlib.pyplot as plt

# 精度プロット
plt.plot(history_no_dropout.history['accuracy'], label='No Dropout Train Accuracy')
plt.plot(history_no_dropout.history['val_accuracy'], label='No Dropout Val Accuracy')
plt.plot(history_with_dropout.history['accuracy'], label='Dropout Train Accuracy')
plt.plot(history_with_dropout.history['val_accuracy'], label='Dropout Val Accuracy')
plt.title('Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

# 損失をプロット
plt.plot(history_no_dropout.history['loss'], label='No Dropout Train Loss')
plt.plot(history_no_dropout.history['val_loss'], label='No Dropout Val Loss')
plt.plot(history_with_dropout.history['loss'], label='Dropout Train Loss')
plt.plot(history_with_dropout.history['val_loss'], label='Dropout Val Loss')
plt.title('Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.show()

Dropoutを加えることで、訓練精度がやや下がる一方、検証精度や損失の安定性が向上していることが期待されます。

以下が精度をプロットしたものです。

精度グラフ

以下が損失をプロットしたものです。

損失グラフ

Dropoutの効果を考察|過学習への対策として有効か?

1. Dropoutなし:高精度だが過学習が発生

Dropoutなしのモデルでは、訓練精度が100%に達する一方で、検証損失が徐々に悪化する傾向が見られました。

これは、モデルが訓練データに過剰に適応してしまい、新しいデータに対して一般化できていない状態、つまり「過学習」です。

2. Dropoutあり:安定した精度と損失の推移

Dropoutありのモデルでは、訓練精度が完全には達しない一方で、検証精度と損失は安定しており、汎化性能の向上が確認できました。

Dropoutによって、学習時にノードが無効化されるため、複数の経路から学習が進み、ロバストなモデル構築が可能になります。

結論|Dropoutは深層学習における過学習対策の切り札

本記事では、KerasとMNISTを使い、Dropoutの有無による画像分類モデルの学習挙動を比較しました。

その結果、Dropoutを使うことで、過学習を抑え、安定した汎化性能を得られることが明確になりました。

実務で活かすためのポイント:

  • 特にデータが少ない・モデルが複雑なときにDropoutは効果的
  • Dropoutは全結合層に追加するのが一般的
  • パラメータは0.3〜0.5程度で試すのが良い

少し精度が落ちても、本番環境で安定して動くモデルを目指すなら、Dropoutは必須の技術です。

このブログを検索

このブログのまとめページ

自己紹介

はじめまして、機械学習を独学中のSHOU TAKEと申します。本ブログでは、Python・Keras・Google Colabを活用した画像分類やニューラルネットワークの実験記事を中心に発信しています。初学者の方にも分かりやすく、学んだことをそのまま実験形式でまとめるスタイルです。これまで取り組んだテーマには、学習率やOptimizerの比較、Batch Sizeの検証、事前学習の活用などがあります。ご質問やご感想は、お問い合わせフォームからお気軽にどうぞ。

お問い合わせフォーム

名前

メール *

メッセージ *

プライバシーポリシー

QooQ