Kerasで過学習対策としてDropoutを使うとき、率をいくつにすればいいか迷ったことはありませんか?
「とりあえず0.5にしている」「0.2と0.5どちらが良いか分からない」——そんな疑問に実験で答えます。今回はGoogle ColabとCIFAR-10を使い、Dropout率を0.0・0.2・0.5の3パターンで比較しました。
なお、Dropoutの基本的な仕組みや「あり/なし」の効果については → 【Keras/CNN】Dropoutの効果をコードで可視化!使い所と設定値の決め方 で解説しています。本記事はその続編として「率の違い」に焦点を当てます。
📘 この記事でわかること
- Dropout率0.0・0.2・0.5でval_accuracyと過学習の度合いがどう変わるか
- train_loss と val_loss の乖離から過学習を読み取る方法
- CIFAR-10レベルのタスクで最適なDropout率の目安
実験設定
使用環境はGoogle Colab(GPU:T4)、データセットはCIFAR-10(32×32×3のカラー画像、10クラス)です。
Dropout率以外の条件(モデル構成・Optimizer・エポック数・バッチサイズ)は全て同一にして、Dropout率の影響だけを取り出します。Dropoutは全結合層(Dense)の直後に配置します。
| パターン | Dropout率 | 意味 |
|---|---|---|
| A | 0.0(なし) | ベースライン。Dropout層なしと同等 |
| B | 0.2 | 軽めの正則化。20%のノードを無効化 |
| C | 0.5 | 強めの正則化。50%のノードを無効化 |
実験コード
環境準備(最初に一度だけ実行)
# ── 環境準備(最初に一度だけ実行)──────────────────────
!apt-get -y install fonts-ipafont-gothic
!rm -rf /root/.cache/matplotlib
!pip install -q japanize_matplotlib
print("環境準備完了")
実行結果をクリックして内容を開く
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
fonts-ipafont-mincho
The following NEW packages will be installed:
fonts-ipafont-gothic fonts-ipafont-mincho
0 upgraded, 2 newly installed, 0 to remove and 42 not upgraded.
Need to get 8,237 kB of archives.
After this operation, 28.7 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 fonts-ipafont-gothic all 00303-21ubuntu1 [3,513 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy/universe amd64 fonts-ipafont-mincho all 00303-21ubuntu1 [4,724 kB]
Fetched 8,237 kB in 3s (2,810 kB/s)
Selecting previously unselected package fonts-ipafont-gothic.
(Reading database ... 122354 files and directories currently installed.)
Preparing to unpack .../fonts-ipafont-gothic_00303-21ubuntu1_all.deb ...
Unpacking fonts-ipafont-gothic (00303-21ubuntu1) ...
Selecting previously unselected package fonts-ipafont-mincho.
Preparing to unpack .../fonts-ipafont-mincho_00303-21ubuntu1_all.deb ...
Unpacking fonts-ipafont-mincho (00303-21ubuntu1) ...
Setting up fonts-ipafont-mincho (00303-21ubuntu1) ...
update-alternatives: using /usr/share/fonts/opentype/ipafont-mincho/ipam.ttf to provide /usr/share/fonts/truetype/fonts-japanese-mincho.ttf (fonts-japanese-mincho.ttf) in auto mode
Setting up fonts-ipafont-gothic (00303-21ubuntu1) ...
update-alternatives: using /usr/share/fonts/opentype/ipafont-gothic/ipag.ttf to provide /usr/share/fonts/truetype/fonts-japanese-gothic.ttf (fonts-japanese-gothic.ttf) in auto mode
Processing triggers for fontconfig (2.13.1-4.2ubuntu5) ...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.1/4.1 MB 114.6 MB/s eta 0:00:00
Preparing metadata (setup.py) ... done
Building wheel for japanize_matplotlib (setup.py) ... done
環境準備完了
import・データ準備・モデル構築関数
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import japanize_matplotlib
import time
# CIFAR-10データの読み込み・前処理
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
# モデル構築関数(dropout_rateを引数で切り替え)
def build_model(dropout_rate, name):
return keras.Sequential([
keras.layers.Input(shape=(32, 32, 3)),
keras.layers.Conv2D(64, (3, 3), activation='relu', padding='same'),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Conv2D(128, (3, 3), activation='relu', padding='same'),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.GlobalAveragePooling2D(),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dropout(dropout_rate), # ← ここだけ変える
keras.layers.Dense(10, activation='softmax'),
], name=name)
# 共通コンパイル&学習関数
def compile_and_fit(model):
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
start = time.time()
history = model.fit(
x_train, y_train,
epochs=30,
batch_size=64,
validation_split=0.2,
verbose=1
)
elapsed = time.time() - start
return history, elapsed
実行結果をクリックして内容を開く
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 170498071/170498071 ━━━━━━━━━━━━━━━━━━━━ 19s 0us/step
3パターンの学習実行
print("\n=== Pattern A:Dropout率=0.0 ===")
model_A = build_model(0.0, 'A_dropout0.0')
history_A, time_A = compile_and_fit(model_A)
print(f"学習時間:{time_A:.1f}秒")
print("\n=== Pattern B:Dropout率=0.2 ===")
model_B = build_model(0.2, 'B_dropout0.2')
history_B, time_B = compile_and_fit(model_B)
print(f"学習時間:{time_B:.1f}秒")
print("\n=== Pattern C:Dropout率=0.5 ===")
model_C = build_model(0.5, 'C_dropout0.5')
history_C, time_C = compile_and_fit(model_C)
print(f"学習時間:{time_C:.1f}秒")
# テストデータで最終精度を評価
test_results = {
'A:Dropout=0.0': model_A.evaluate(x_test, y_test, verbose=0),
'B:Dropout=0.2': model_B.evaluate(x_test, y_test, verbose=0),
'C:Dropout=0.5': model_C.evaluate(x_test, y_test, verbose=0),
}
実行結果をクリックして内容を開く
=== Pattern A:Dropout率=0.0 === Epoch 1/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 17s 16ms/step - accuracy: 0.2720 - loss: 1.9255 - val_accuracy: 0.3329 - val_loss: 1.7775 Epoch 2/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3726 - loss: 1.6729 - val_accuracy: 0.4117 - val_loss: 1.5959 Epoch 3/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4263 - loss: 1.5593 - val_accuracy: 0.4469 - val_loss: 1.5149 Epoch 4/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4685 - loss: 1.4603 - val_accuracy: 0.4811 - val_loss: 1.4257 Epoch 5/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4963 - loss: 1.3884 - val_accuracy: 0.5012 - val_loss: 1.3957 Epoch 6/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5147 - loss: 1.3364 - val_accuracy: 0.5220 - val_loss: 1.3204 Epoch 7/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5315 - loss: 1.2943 - val_accuracy: 0.5308 - val_loss: 1.2998 Epoch 8/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5472 - loss: 1.2490 - val_accuracy: 0.5459 - val_loss: 1.2586 Epoch 9/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5574 - loss: 1.2143 - val_accuracy: 0.5477 - val_loss: 1.2389 Epoch 10/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5727 - loss: 1.1832 - val_accuracy: 0.5587 - val_loss: 1.2121 Epoch 11/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5820 - loss: 1.1612 - val_accuracy: 0.5794 - val_loss: 1.1650 Epoch 12/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5901 - loss: 1.1363 - val_accuracy: 0.5875 - val_loss: 1.1436 Epoch 13/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6001 - loss: 1.1119 - val_accuracy: 0.5950 - val_loss: 1.1159 Epoch 14/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 7s 10ms/step - accuracy: 0.6062 - loss: 1.0899 - val_accuracy: 0.5929 - val_loss: 1.1463 Epoch 15/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6148 - loss: 1.0725 - val_accuracy: 0.6154 - val_loss: 1.0812 Epoch 16/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6222 - loss: 1.0491 - val_accuracy: 0.6027 - val_loss: 1.1080 Epoch 17/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6263 - loss: 1.0402 - val_accuracy: 0.6213 - val_loss: 1.0678 Epoch 18/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6353 - loss: 1.0119 - val_accuracy: 0.6252 - val_loss: 1.0387 Epoch 19/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6425 - loss: 0.9970 - val_accuracy: 0.6203 - val_loss: 1.0563 Epoch 20/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6479 - loss: 0.9806 - val_accuracy: 0.6357 - val_loss: 1.0224 Epoch 21/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6530 - loss: 0.9679 - val_accuracy: 0.6291 - val_loss: 1.0282 Epoch 22/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6600 - loss: 0.9523 - val_accuracy: 0.6513 - val_loss: 0.9875 Epoch 23/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6639 - loss: 0.9397 - val_accuracy: 0.6389 - val_loss: 1.0118 Epoch 24/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6686 - loss: 0.9251 - val_accuracy: 0.6323 - val_loss: 1.0378 Epoch 25/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6716 - loss: 0.9169 - val_accuracy: 0.6464 - val_loss: 0.9816 Epoch 26/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6807 - loss: 0.9019 - val_accuracy: 0.6571 - val_loss: 0.9673 Epoch 27/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 5s 7ms/step - accuracy: 0.6827 - loss: 0.8891 - val_accuracy: 0.6586 - val_loss: 0.9438 Epoch 28/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 5s 8ms/step - accuracy: 0.6857 - loss: 0.8802 - val_accuracy: 0.6612 - val_loss: 0.9650 Epoch 29/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6903 - loss: 0.8667 - val_accuracy: 0.6505 - val_loss: 0.9730 Epoch 30/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6975 - loss: 0.8520 - val_accuracy: 0.6604 - val_loss: 0.9526 学習時間:135.8秒 === Pattern B:Dropout率=0.2 === Epoch 1/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 8s 9ms/step - accuracy: 0.2626 - loss: 1.9283 - val_accuracy: 0.3623 - val_loss: 1.7258 Epoch 2/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3735 - loss: 1.6715 - val_accuracy: 0.4288 - val_loss: 1.6041 Epoch 3/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.4312 - loss: 1.5435 - val_accuracy: 0.4638 - val_loss: 1.4607 Epoch 4/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.4668 - loss: 1.4580 - val_accuracy: 0.4862 - val_loss: 1.3944 Epoch 5/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4902 - loss: 1.3944 - val_accuracy: 0.5195 - val_loss: 1.3148 Epoch 6/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5087 - loss: 1.3469 - val_accuracy: 0.5296 - val_loss: 1.2924 Epoch 7/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.5199 - loss: 1.3092 - val_accuracy: 0.5384 - val_loss: 1.2642 Epoch 8/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5331 - loss: 1.2728 - val_accuracy: 0.5580 - val_loss: 1.2198 Epoch 9/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5454 - loss: 1.2471 - val_accuracy: 0.5472 - val_loss: 1.2345 Epoch 10/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.5589 - loss: 1.2180 - val_accuracy: 0.5721 - val_loss: 1.1636 Epoch 11/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5729 - loss: 1.1901 - val_accuracy: 0.5725 - val_loss: 1.1660 Epoch 12/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5789 - loss: 1.1691 - val_accuracy: 0.5826 - val_loss: 1.1401 Epoch 13/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5871 - loss: 1.1443 - val_accuracy: 0.5939 - val_loss: 1.1192 Epoch 14/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5954 - loss: 1.1224 - val_accuracy: 0.6109 - val_loss: 1.0827 Epoch 15/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6029 - loss: 1.0985 - val_accuracy: 0.6021 - val_loss: 1.1120 Epoch 16/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6125 - loss: 1.0820 - val_accuracy: 0.6209 - val_loss: 1.0415 Epoch 17/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6183 - loss: 1.0671 - val_accuracy: 0.6204 - val_loss: 1.0491 Epoch 18/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6224 - loss: 1.0464 - val_accuracy: 0.6306 - val_loss: 1.0312 Epoch 19/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6299 - loss: 1.0283 - val_accuracy: 0.6333 - val_loss: 1.0142 Epoch 20/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6381 - loss: 1.0130 - val_accuracy: 0.6364 - val_loss: 1.0045 Epoch 21/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.6444 - loss: 0.9919 - val_accuracy: 0.6398 - val_loss: 1.0064 Epoch 22/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6456 - loss: 0.9846 - val_accuracy: 0.6494 - val_loss: 0.9660 Epoch 23/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 7s 11ms/step - accuracy: 0.6544 - loss: 0.9671 - val_accuracy: 0.6552 - val_loss: 0.9570 Epoch 24/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 7s 6ms/step - accuracy: 0.6599 - loss: 0.9517 - val_accuracy: 0.6524 - val_loss: 0.9659 Epoch 25/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.6617 - loss: 0.9403 - val_accuracy: 0.6609 - val_loss: 0.9406 Epoch 26/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6702 - loss: 0.9288 - val_accuracy: 0.6634 - val_loss: 0.9323 Epoch 27/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6733 - loss: 0.9149 - val_accuracy: 0.6727 - val_loss: 0.9139 Epoch 28/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6751 - loss: 0.9062 - val_accuracy: 0.6681 - val_loss: 0.9152 Epoch 29/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6822 - loss: 0.8856 - val_accuracy: 0.6813 - val_loss: 0.8980 Epoch 30/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6861 - loss: 0.8814 - val_accuracy: 0.6842 - val_loss: 0.8938 学習時間:132.1秒 === Pattern C:Dropout率=0.5 === Epoch 1/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 8s 8ms/step - accuracy: 0.2518 - loss: 1.9577 - val_accuracy: 0.3333 - val_loss: 1.7661 Epoch 2/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.3572 - loss: 1.7072 - val_accuracy: 0.3986 - val_loss: 1.6423 Epoch 3/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4113 - loss: 1.5892 - val_accuracy: 0.4432 - val_loss: 1.5146 Epoch 4/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4468 - loss: 1.5036 - val_accuracy: 0.4709 - val_loss: 1.4361 Epoch 5/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4708 - loss: 1.4414 - val_accuracy: 0.5056 - val_loss: 1.3541 Epoch 6/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4919 - loss: 1.3906 - val_accuracy: 0.5143 - val_loss: 1.3277 Epoch 7/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5051 - loss: 1.3584 - val_accuracy: 0.5336 - val_loss: 1.2791 Epoch 8/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5150 - loss: 1.3286 - val_accuracy: 0.5393 - val_loss: 1.2384 Epoch 9/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.5258 - loss: 1.3009 - val_accuracy: 0.5376 - val_loss: 1.2503 Epoch 10/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5354 - loss: 1.2734 - val_accuracy: 0.5687 - val_loss: 1.1805 Epoch 11/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5471 - loss: 1.2503 - val_accuracy: 0.5662 - val_loss: 1.1867 Epoch 12/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.5556 - loss: 1.2239 - val_accuracy: 0.5644 - val_loss: 1.1892 Epoch 13/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5577 - loss: 1.2100 - val_accuracy: 0.5903 - val_loss: 1.1220 Epoch 14/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5695 - loss: 1.1819 - val_accuracy: 0.5876 - val_loss: 1.1147 Epoch 15/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.5793 - loss: 1.1614 - val_accuracy: 0.5979 - val_loss: 1.0984 Epoch 16/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5895 - loss: 1.1430 - val_accuracy: 0.5918 - val_loss: 1.1074 Epoch 17/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5927 - loss: 1.1277 - val_accuracy: 0.6100 - val_loss: 1.0779 Epoch 18/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5983 - loss: 1.1101 - val_accuracy: 0.6140 - val_loss: 1.0510 Epoch 19/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6075 - loss: 1.0950 - val_accuracy: 0.6113 - val_loss: 1.0549 Epoch 20/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6068 - loss: 1.0836 - val_accuracy: 0.6222 - val_loss: 1.0349 Epoch 21/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6161 - loss: 1.0687 - val_accuracy: 0.6302 - val_loss: 1.0220 Epoch 22/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6232 - loss: 1.0502 - val_accuracy: 0.6206 - val_loss: 1.0194 Epoch 23/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.6249 - loss: 1.0457 - val_accuracy: 0.6372 - val_loss: 0.9912 Epoch 24/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6291 - loss: 1.0323 - val_accuracy: 0.6398 - val_loss: 0.9890 Epoch 25/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6359 - loss: 1.0151 - val_accuracy: 0.6492 - val_loss: 0.9720 Epoch 26/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6402 - loss: 1.0099 - val_accuracy: 0.6536 - val_loss: 0.9718 Epoch 27/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6431 - loss: 0.9962 - val_accuracy: 0.6540 - val_loss: 0.9504 Epoch 28/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6463 - loss: 0.9858 - val_accuracy: 0.6533 - val_loss: 0.9578 Epoch 29/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6517 - loss: 0.9750 - val_accuracy: 0.6533 - val_loss: 0.9500 Epoch 30/30 625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6512 - loss: 0.9667 - val_accuracy: 0.6622 - val_loss: 0.9294 学習時間:124.4秒
グラフ+サマリー
histories = {
'A:Dropout=0.0': history_A,
'B:Dropout=0.2': history_B,
'C:Dropout=0.5': history_C,
}
# ── val_accuracy / val_loss 比較グラフ ───────────────
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
for label, h in histories.items():
axes[0].plot(h.history['val_accuracy'], label=label)
axes[1].plot(h.history['val_loss'], label=label)
axes[0].set_title('val_accuracy の比較(全30エポック)')
axes[1].set_title('val_loss の比較(全30エポック)')
for ax in axes:
ax.set_xlabel('Epoch'); ax.legend(); ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('dropout_rate_comparison.png', dpi=150)
plt.show()
# ── train_loss vs val_loss(過学習の乖離を見る)────────
fig2, axes2 = plt.subplots(1, 3, figsize=(18, 5))
for i, (label, h) in enumerate(histories.items()):
axes2[i].plot(h.history['loss'], label='train_loss')
axes2[i].plot(h.history['val_loss'], label='val_loss')
axes2[i].set_title(f'{label}')
axes2[i].set_xlabel('Epoch'); axes2[i].legend(); axes2[i].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('dropout_rate_overfit.png', dpi=150)
plt.show()
# ── 最終結果サマリー ─────────────────────────────────
key_order = ['A:Dropout=0.0', 'B:Dropout=0.2', 'C:Dropout=0.5']
time_list = {'A:Dropout=0.0': time_A, 'B:Dropout=0.2': time_B, 'C:Dropout=0.5': time_C}
print("\n===== 最終結果サマリー =====")
print(f"{'Pattern':>18} | {'Val Acc':>8} | {'Test Acc':>9} | {'Time(s)':>8}")
print("-" * 52)
for key in key_order:
val_acc = histories[key].history['val_accuracy'][-1]
test_loss, test_acc = test_results[key]
elapsed = time_list[key]
print(f"{key:>18} | {val_acc:>8.4f} | {test_acc:>9.4f} | {elapsed:>8.1f}")
print("-" * 52)
実行結果
===== 最終結果サマリー =====
Pattern | Val Acc | Test Acc | Time(s)
----------------------------------------------------
A:Dropout=0.0 | 0.6604 | 0.6564 | 135.8
B:Dropout=0.2 | 0.6842 | 0.6735 | 132.1
C:Dropout=0.5 | 0.6622 | 0.6653 | 124.4
----------------------------------------------------
実験結果
精度グラフ
損失グラフ
A:Dropout=0.0
B:Dropout=0.2
C:Dropout=0.5
| パターン | 最終 val_accuracy | 最終 test_accuracy | 学習時間 | 過学習の度合い |
|---|---|---|---|---|
| A:Dropout=0.0 | 66.04% | 65.64% | 135.8秒 | 収束途中・乖離小 |
| B:Dropout=0.2 | 68.42% | 67.35% | 132.1秒 | 最も安定 |
| C:Dropout=0.5 | 66.22% | 66.53% | 124.4秒 | 収束途中・train>val |
考察
① 3パターンの結果をどう読むか
最高精度は Dropout=0.2(test_accuracy: 67.35%) でした。Dropoutなし(0.0)の65.64%より高く、0.5の66.53%とも差があります。「強い正則化ほど良い」というわけではなく、適度な正則化が最もバランスが良いという結果になりました。
また、3パターンとも30エポック時点でまだ収束しきっておらず、val_lossが緩やかに下降中です。GAP使用モデル自体に正則化効果があるため、いずれのパターンでも深刻な過学習は起きていません。これが3パターンの精度差が小さくなった理由のひとつです。
② train_loss vs val_loss の乖離を比較する
Ep30時点の train_loss と val_loss を比較します。
| パターン | Ep30 train_loss | Ep30 val_loss | 乖離 | 状態 |
|---|---|---|---|---|
| A:Dropout=0.0 | 0.852 | 0.953 | +0.101 | 軽度の過学習 |
| B:Dropout=0.2 | 0.881 | 0.894 | +0.013 | ほぼ乖離なし・最安定 |
| C:Dropout=0.5 | 0.967 | 0.929 | −0.038 | train_loss > val_loss(逆転) |
Dropout=0.2 はtrain_lossとval_lossの乖離がほぼゼロで、3パターンの中で最も安定しています。
Dropout=0.5 ではtrain_lossがval_lossを上回る「逆転」が起きています。これは異常ではなく、Dropoutの仕組みによる正常な挙動です。Dropoutは訓練時のみノードを無効化し、推論時(val/test)は全ノードを使用します。そのため率が高いほど訓練時のlossは大きく見え、val_lossとの大小が逆転することがあります。
③ GAP+Dropout=0.2 がこのモデルに最適な理由
今回のモデルはGAPを使っているため、GAPそのものに正則化効果があります。そのうえでDropout=0.5のような強い正則化を重ねると、正則化が効きすぎてモデルの表現力が制限され、精度が下がる結果になりました。
Dropout=0.2 は「GAPの正則化効果をほどよく補強する」役割を果たし、過学習を抑えながら精度も維持できる最適なバランスポイントでした。GAP使用モデルでは、Dropoutを使うなら率は控えめ(0.1〜0.3程度)が適切という実用的な知見が得られました。
まとめ
- Dropout率を0.0・0.2・0.5の3パターンで比較し、過学習の度合いと精度の変化を実験で確認した
- 率が高いほど過学習は抑えられるが、高すぎると表現力が下がり精度が落ちるトレードオフがある
- GAP使用モデルではGAP自体に正則化効果があるため、Dropoutなし(0.0)でも比較的安定している可能性がある
- 迷ったらまず0.2から試して、過学習が気になれば0.5に上げるのが実用的なアプローチ
関連記事もあわせてどうぞ:
- Dropoutの基本と「あり/なし」比較 → 【Keras/CNN】Dropoutの効果をコードで可視化!使い所と設定値の決め方
- BatchNormalizationとDropoutの併用実験 → BatchNormalizationはDropoutと併用すべきか?Keras×MNISTで4パターン比較
- 過学習の判定方法と対策 → CIFAR-10で学ぶ:過学習(オーバーフィッティング)の判定方法と実践的対策
- Conv2Dのフィルター数の選び方 → Conv2DのFilters数(32 vs 64 vs 128)を変えると精度はどう変わる?【CIFAR-10実験】






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