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を超えると学習が不安定になる場合があります。
③ Conv2Dの層数
層を増やすと特徴抽出能力が向上します。ただしCIFAR-10規模では4層以上になると過学習しやすく、精度が逆に下がるケースがありました。2〜3層が安定帯です。
④ Dense層のユニット数
ユニット数を増やすほど表現力は上がりますが、過学習のリスクも増加します。迷ったらまず128から試すのがおすすめです。
⑤ Optimizer(最適化手法)
Adamは収束が速く安定しやすく、初心者にも扱いやすい選択です。SGDは調整次第で高精度が狙えますが、学習率スケジューラとの併用が前提になります。
⑥ Batch Size(バッチサイズ)
小さいほど汎化性能は向上しやすく、大きいほど学習は高速化します。極端に大きいバッチサイズ(512以上)は精度が下がりやすいため注意です。
⑦ Activation関数
ReLUが基本ですが、GELUやELUは場合によっては精度が改善します。変更の効果は小さいため、他のパラメータが固まってから試すのが効率的です。
⑧ Pooling設定
MaxPoolingのサイズやGAPの使用は、精度と速度の両方に影響します。GAP(Global Average 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の精度は単一のパラメータではなく、複数の要素の組み合わせで決まります。
調整の優先順位は次のとおりです。
- 学習率(最も感度が高い)
- Dropout(過学習の有無を見ながら調整)
- 層構造(Conv層数・Dense層)
- Optimizer・Activation(ある程度固まってから)
本記事の推奨構成をベースに、各パラメータの詳細記事を参照しながら調整することで、効率的に精度を改善できます。

0 件のコメント:
コメントを投稿