Keras CNNの精度は何で決まる?主要ハイパーパラメータ比較まとめ【CIFAR-10実験】

投稿日:2026年5月1日金曜日 最終更新日:

Adam CIFAR-10 CNN Conv2D Dropout Google Colab Keras TensorFlow ハイパーパラメータ 過学習対策 学習率 機械学習 深層学習

X f B! P L
Keras CNNの精度は何で決まる?主要ハイパーパラメータ比較まとめ【CIFAR-10実験】 アイキャッチ画像

KerasでCNNを組むとき、「どのハイパーパラメータをどう設定すれば精度が上がるのか?」で迷うことはありませんか?

本記事では、CIFAR-10を使って主要なハイパーパラメータ(学習率・Dropout・層構造など)を実験比較し、精度に与える影響と最適な選び方をまとめました。各パラメータの詳細は個別記事にリンクしています。

結論:最短で知りたい人向け

  • 最も影響が大きい:学習率・Dropout・層構造(この順に精度への感度が高かった)
  • 安定して強い構成:Adam + ReLU + Conv2D(2〜3層)
  • 過学習対策:Dropout 0.2〜0.5 + EarlyStopping
  • 迷ったら:「小さく作って徐々に増やす」が最適

検証環境

  • データセット:CIFAR-10
  • フレームワーク:Keras(TensorFlowバックエンド)
  • 実行環境:Google Colab(T4 GPU)

ハイパーパラメータ別の影響まとめ

① 学習率(Learning Rate)

最も精度への影響が大きいパラメータです。高すぎると損失が発散し、低すぎると学習が進みません。Adamを使う場合は1e-3(デフォルト)から試すのが基本です。

学習率の比較はこちら

② Dropout(過学習対策)

0.2〜0.5の範囲がバランス良く、過学習抑制に効果的です。0.5を超えると学習が不安定になる場合があります。

Dropout比較はこちら

③ Conv2Dの層数

層を増やすと特徴抽出能力が向上します。ただしCIFAR-10規模では4層以上になると過学習しやすく、精度が逆に下がるケースがありました。2〜3層が安定帯です。

Conv層数の比較はこちら

④ Dense層のユニット数

ユニット数を増やすほど表現力は上がりますが、過学習のリスクも増加します。迷ったらまず128から試すのがおすすめです。

Dense層のユニット数比較はこちら

⑤ Optimizer(最適化手法)

Adamは収束が速く安定しやすく、初心者にも扱いやすい選択です。SGDは調整次第で高精度が狙えますが、学習率スケジューラとの併用が前提になります。

Optimizer比較はこちら

⑥ Batch Size(バッチサイズ)

小さいほど汎化性能は向上しやすく、大きいほど学習は高速化します。極端に大きいバッチサイズ(512以上)は精度が下がりやすいため注意です。

バッチサイズ比較はこちら

⑦ Activation関数

ReLUが基本ですが、GELUやELUは場合によっては精度が改善します。変更の効果は小さいため、他のパラメータが固まってから試すのが効率的です。

Activation比較はこちら

⑧ Pooling設定

MaxPoolingのサイズやGAPの使用は、精度と速度の両方に影響します。GAP(Global Average Pooling)はパラメータ削減にも有効です。

Pooling比較はこちら

最適構成(本検証の結論)とサンプルコード

上記の検証をもとにした、CIFAR-10で安定して動く推奨構成です。そのままGoogle Colabで動かせます。

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# データ準備
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

# 推奨構成モデル
model = keras.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)),
    layers.Conv2D(64, (3, 3), activation='relu', padding='same'),
    layers.MaxPooling2D(2, 2),
    layers.Dropout(0.25),

    layers.Conv2D(128, (3, 3), activation='relu', padding='same'),
    layers.MaxPooling2D(2, 2),
    layers.Dropout(0.25),

    layers.GlobalAveragePooling2D(),  # GAP でパラメータを削減
    layers.Dense(256, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(10, activation='softmax'),
])

model.compile(
    optimizer=keras.optimizers.Adam(learning_rate=1e-3),
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

# EarlyStopping で過学習を防止
early_stop = keras.callbacks.EarlyStopping(patience=5, restore_best_weights=True)

model.fit(
    x_train, y_train,
    batch_size=64,
    epochs=50,
    validation_split=0.1,
    callbacks=[early_stop]
)

print(model.evaluate(x_test, y_test))

よくある失敗パターン

  • 学習率が高すぎて損失が発散する(lr=0.1など)
  • Conv層を増やしすぎて過学習する(CIFAR-10では4層以上は要注意)
  • Dropoutを入れずに精度が頭打ちになる
  • バッチサイズを極端に大きくして汎化性能が下がる

まとめ

CNNの精度は単一のパラメータではなく、複数の要素の組み合わせで決まります。

調整の優先順位は次のとおりです。

  1. 学習率(最も感度が高い)
  2. Dropout(過学習の有無を見ながら調整)
  3. 層構造(Conv層数・Dense層)
  4. Optimizer・Activation(ある程度固まってから)

本記事の推奨構成をベースに、各パラメータの詳細記事を参照しながら調整することで、効率的に精度を改善できます。