Adamのlearning_rateを変えると何が起きる?(0.001 vs 0.01 vs 0.0001)【Keras×CIFAR-10実験】

投稿日:2026年4月24日金曜日 最終更新日:

Adam CIFAR-10 CNN Google Colab Keras Learning Rate 学習率

X f B! P L
Adamのlearning_rateを変えると何が起きる?(0.001 vs 0.01 vs 0.0001)【Keras×CIFAR-10実験】 アイキャッチ画像

KerasでAdamを使うとき、learning_rate はデフォルトの 0.001 のままにしていませんか?

学習率はモデルの収束速度・精度・過学習の度合いを左右する重要なハイパーパラメータです。今回はGoogle ColabとCIFAR-10を使い、learning_rateを0.001・0.01・0.0001の3パターンで比較しました。

なお、MNISTでの学習率比較は → 学習率を変えると精度はどうなる?Keras×CNNで画像分類の比較実験【MNIST】 をご覧ください。本記事はCIFAR-10・GAP構成でより踏み込んだ比較を行います。

📘 この記事でわかること

  • learning_rateを変えると収束速度・精度・過学習の度合いがどう変わるか
  • 学習率が高すぎる・低すぎるときに何が起きるか
  • CIFAR-10+GAP構成でのAdamの最適な学習率の目安

learning_rateとは?変えると何が起きるか

学習率はパラメータを1回の更新でどれだけ動かすかを決める値です。

learning_rate 更新の大きさ 期待される挙動
0.01(大きい) 大きく動く 収束が速いが、不安定になったり最適解を飛び越える可能性あり
0.001(デフォルト) 中程度 Adamのデフォルト値。多くのタスクで安定して動く
0.0001(小さい) 小さく動く 安定した学習だが収束が遅く、エポック数が足りないと精度が低い

実験コード

使用環境はGoogle Colab(GPU:T4)、データセットはCIFAR-10です。learning_rate以外の条件は全て同一にして、学習率の影響だけを取り出します。

環境準備(最初に一度だけ実行)

# ── 環境準備(最初に一度だけ実行)──────────────────────
!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 (3,006 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 73.4 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

(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

def build_model(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(0.2),
        keras.layers.Dense(10, activation='softmax'),
    ], name=name)

def compile_and_fit(model, lr):
    model.compile(
        optimizer=keras.optimizers.Adam(learning_rate=lr),
        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)
    return history, time.time() - start
実行結果をクリックして内容を開く
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170498071/170498071 ━━━━━━━━━━━━━━━━━━━━ 14s 0us/step

3パターンの学習実行

configs = [(0.001, 'A_lr0.001'), (0.01, 'B_lr0.01'), (0.0001, 'C_lr0.0001')]
histories, times, scores = {}, {}, {}

for lr, name in configs:
    print(f"\n=== {name} ===")
    model = build_model(name)
    h, t = compile_and_fit(model, lr)
    s = model.evaluate(x_test, y_test, verbose=0)
    label = name.split('_')[1]
    histories[label] = h
    times[label] = t
    scores[label] = s
    print(f"学習時間:{t:.1f}秒 test_accuracy:{s[1]:.4f}")
実行結果をクリックして内容を開く
=== A_lr0.001 ===
Epoch 1/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 23s 19ms/step - accuracy: 0.2607 - loss: 1.9424 - val_accuracy: 0.3113 - val_loss: 1.8018
Epoch 2/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 6s 9ms/step - accuracy: 0.3696 - loss: 1.6800 - val_accuracy: 0.4174 - val_loss: 1.5788
Epoch 3/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 6s 9ms/step - accuracy: 0.4238 - loss: 1.5596 - val_accuracy: 0.4280 - val_loss: 1.5710
Epoch 4/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 7s 11ms/step - accuracy: 0.4583 - loss: 1.4814 - val_accuracy: 0.4688 - val_loss: 1.4248
Epoch 5/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 7s 10ms/step - accuracy: 0.4824 - loss: 1.4209 - val_accuracy: 0.5168 - val_loss: 1.3365
Epoch 6/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5019 - loss: 1.3684 - val_accuracy: 0.5136 - val_loss: 1.3212
Epoch 7/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5191 - loss: 1.3193 - val_accuracy: 0.5379 - val_loss: 1.2662
Epoch 8/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5325 - loss: 1.2865 - val_accuracy: 0.5328 - val_loss: 1.2677
Epoch 9/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 6s 9ms/step - accuracy: 0.5404 - loss: 1.2607 - val_accuracy: 0.5483 - val_loss: 1.2338
Epoch 10/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5543 - loss: 1.2283 - val_accuracy: 0.5676 - val_loss: 1.1894
Epoch 11/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5641 - loss: 1.2061 - val_accuracy: 0.5739 - val_loss: 1.1700
Epoch 12/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.5738 - loss: 1.1767 - val_accuracy: 0.5827 - val_loss: 1.1510
Epoch 13/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5820 - loss: 1.1566 - val_accuracy: 0.5990 - val_loss: 1.1069
Epoch 14/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5924 - loss: 1.1354 - val_accuracy: 0.5804 - val_loss: 1.1586
Epoch 15/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5960 - loss: 1.1178 - val_accuracy: 0.6052 - val_loss: 1.0911
Epoch 16/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6024 - loss: 1.1035 - val_accuracy: 0.6066 - val_loss: 1.0825
Epoch 17/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6108 - loss: 1.0815 - val_accuracy: 0.6151 - val_loss: 1.0565
Epoch 18/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 6s 10ms/step - accuracy: 0.6191 - loss: 1.0628 - val_accuracy: 0.6217 - val_loss: 1.0444
Epoch 19/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 6s 10ms/step - accuracy: 0.6239 - loss: 1.0553 - val_accuracy: 0.6250 - val_loss: 1.0417
Epoch 20/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 9s 8ms/step - accuracy: 0.6285 - loss: 1.0355 - val_accuracy: 0.6268 - val_loss: 1.0266
Epoch 21/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 5s 8ms/step - accuracy: 0.6343 - loss: 1.0198 - val_accuracy: 0.6310 - val_loss: 1.0154
Epoch 22/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6418 - loss: 1.0024 - val_accuracy: 0.6363 - val_loss: 1.0106
Epoch 23/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6438 - loss: 0.9896 - val_accuracy: 0.6450 - val_loss: 0.9834
Epoch 24/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6482 - loss: 0.9796 - val_accuracy: 0.6313 - val_loss: 1.0319
Epoch 25/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 7s 11ms/step - accuracy: 0.6530 - loss: 0.9685 - val_accuracy: 0.6413 - val_loss: 0.9805
Epoch 26/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 5s 8ms/step - accuracy: 0.6571 - loss: 0.9532 - val_accuracy: 0.6441 - val_loss: 0.9832
Epoch 27/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6604 - loss: 0.9428 - val_accuracy: 0.6621 - val_loss: 0.9494
Epoch 28/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6680 - loss: 0.9272 - val_accuracy: 0.6664 - val_loss: 0.9282
Epoch 29/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6687 - loss: 0.9191 - val_accuracy: 0.6539 - val_loss: 0.9678
Epoch 30/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6738 - loss: 0.9111 - val_accuracy: 0.6510 - val_loss: 0.9715
学習時間:164.8秒 test_accuracy:0.6477

=== B_lr0.01 ===
Epoch 1/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 9s 8ms/step - accuracy: 0.2262 - loss: 2.0223 - val_accuracy: 0.2826 - val_loss: 1.8713
Epoch 2/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.2934 - loss: 1.8264 - val_accuracy: 0.3246 - val_loss: 1.7273
Epoch 3/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.3341 - loss: 1.7391 - val_accuracy: 0.3555 - val_loss: 1.6780
Epoch 4/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3568 - loss: 1.6974 - val_accuracy: 0.3761 - val_loss: 1.6453
Epoch 5/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3811 - loss: 1.6497 - val_accuracy: 0.4087 - val_loss: 1.5983
Epoch 6/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4034 - loss: 1.6075 - val_accuracy: 0.4206 - val_loss: 1.5567
Epoch 7/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4232 - loss: 1.5680 - val_accuracy: 0.4370 - val_loss: 1.5019
Epoch 8/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4358 - loss: 1.5389 - val_accuracy: 0.4525 - val_loss: 1.4822
Epoch 9/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4428 - loss: 1.5154 - val_accuracy: 0.4622 - val_loss: 1.4698
Epoch 10/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4568 - loss: 1.4826 - val_accuracy: 0.4576 - val_loss: 1.4783
Epoch 11/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4647 - loss: 1.4706 - val_accuracy: 0.4741 - val_loss: 1.4318
Epoch 12/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4699 - loss: 1.4505 - val_accuracy: 0.4686 - val_loss: 1.4734
Epoch 13/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.4732 - loss: 1.4452 - val_accuracy: 0.4693 - val_loss: 1.4453
Epoch 14/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4785 - loss: 1.4304 - val_accuracy: 0.4783 - val_loss: 1.4074
Epoch 15/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4825 - loss: 1.4198 - val_accuracy: 0.4888 - val_loss: 1.3918
Epoch 16/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.4830 - loss: 1.4179 - val_accuracy: 0.5000 - val_loss: 1.3623
Epoch 17/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4920 - loss: 1.4031 - val_accuracy: 0.5030 - val_loss: 1.3714
Epoch 18/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4905 - loss: 1.4068 - val_accuracy: 0.4828 - val_loss: 1.4013
Epoch 19/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 6s 7ms/step - accuracy: 0.4922 - loss: 1.4008 - val_accuracy: 0.4982 - val_loss: 1.3808
Epoch 20/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4929 - loss: 1.3969 - val_accuracy: 0.4973 - val_loss: 1.3707
Epoch 21/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4906 - loss: 1.3983 - val_accuracy: 0.5048 - val_loss: 1.3660
Epoch 22/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4960 - loss: 1.3865 - val_accuracy: 0.4997 - val_loss: 1.3642
Epoch 23/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4956 - loss: 1.3880 - val_accuracy: 0.5012 - val_loss: 1.3537
Epoch 24/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4978 - loss: 1.3808 - val_accuracy: 0.5184 - val_loss: 1.3405
Epoch 25/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5005 - loss: 1.3766 - val_accuracy: 0.5132 - val_loss: 1.3411
Epoch 26/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 6s 10ms/step - accuracy: 0.4999 - loss: 1.3762 - val_accuracy: 0.5155 - val_loss: 1.3621
Epoch 27/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 8s 7ms/step - accuracy: 0.4998 - loss: 1.3764 - val_accuracy: 0.5090 - val_loss: 1.3453
Epoch 28/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5034 - loss: 1.3646 - val_accuracy: 0.5088 - val_loss: 1.3532
Epoch 29/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5012 - loss: 1.3705 - val_accuracy: 0.5139 - val_loss: 1.3484
Epoch 30/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5040 - loss: 1.3660 - val_accuracy: 0.5213 - val_loss: 1.3327
学習時間:130.2秒 test_accuracy:0.5246

=== C_lr0.0001 ===
Epoch 1/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 8s 9ms/step - accuracy: 0.1949 - loss: 2.1431 - val_accuracy: 0.2475 - val_loss: 2.0306
Epoch 2/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.2506 - loss: 1.9917 - val_accuracy: 0.2935 - val_loss: 1.9330
Epoch 3/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.2795 - loss: 1.9147 - val_accuracy: 0.3061 - val_loss: 1.8728
Epoch 4/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.2968 - loss: 1.8589 - val_accuracy: 0.3279 - val_loss: 1.8158
Epoch 5/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3174 - loss: 1.8073 - val_accuracy: 0.3389 - val_loss: 1.7621
Epoch 6/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3310 - loss: 1.7667 - val_accuracy: 0.3564 - val_loss: 1.7350
Epoch 7/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3411 - loss: 1.7400 - val_accuracy: 0.3618 - val_loss: 1.7147
Epoch 8/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.3500 - loss: 1.7195 - val_accuracy: 0.3669 - val_loss: 1.6974
Epoch 9/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3582 - loss: 1.7006 - val_accuracy: 0.3782 - val_loss: 1.6710
Epoch 10/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3660 - loss: 1.6836 - val_accuracy: 0.3792 - val_loss: 1.6664
Epoch 11/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.3713 - loss: 1.6705 - val_accuracy: 0.3867 - val_loss: 1.6457
Epoch 12/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3816 - loss: 1.6567 - val_accuracy: 0.3967 - val_loss: 1.6311
Epoch 13/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3848 - loss: 1.6437 - val_accuracy: 0.3933 - val_loss: 1.6395
Epoch 14/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3943 - loss: 1.6304 - val_accuracy: 0.4044 - val_loss: 1.6198
Epoch 15/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.3977 - loss: 1.6162 - val_accuracy: 0.4093 - val_loss: 1.5987
Epoch 16/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4040 - loss: 1.6052 - val_accuracy: 0.4117 - val_loss: 1.5919
Epoch 17/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4071 - loss: 1.5949 - val_accuracy: 0.4228 - val_loss: 1.5673
Epoch 18/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4122 - loss: 1.5842 - val_accuracy: 0.4213 - val_loss: 1.5648
Epoch 19/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4214 - loss: 1.5692 - val_accuracy: 0.4235 - val_loss: 1.5602
Epoch 20/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4239 - loss: 1.5579 - val_accuracy: 0.4394 - val_loss: 1.5377
Epoch 21/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 6s 7ms/step - accuracy: 0.4313 - loss: 1.5455 - val_accuracy: 0.4469 - val_loss: 1.5228
Epoch 22/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4371 - loss: 1.5342 - val_accuracy: 0.4445 - val_loss: 1.5141
Epoch 23/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4383 - loss: 1.5289 - val_accuracy: 0.4469 - val_loss: 1.5178
Epoch 24/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4432 - loss: 1.5154 - val_accuracy: 0.4527 - val_loss: 1.4947
Epoch 25/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4457 - loss: 1.5064 - val_accuracy: 0.4578 - val_loss: 1.4878
Epoch 26/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4513 - loss: 1.4959 - val_accuracy: 0.4588 - val_loss: 1.4794
Epoch 27/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.4548 - loss: 1.4855 - val_accuracy: 0.4748 - val_loss: 1.4648
Epoch 28/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4625 - loss: 1.4776 - val_accuracy: 0.4779 - val_loss: 1.4504
Epoch 29/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4645 - loss: 1.4677 - val_accuracy: 0.4773 - val_loss: 1.4405
Epoch 30/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.4680 - loss: 1.4567 - val_accuracy: 0.4711 - val_loss: 1.4546
学習時間:123.7秒 test_accuracy:0.4704

グラフ+サマリー

# ── 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('lr_comparison.png', dpi=150)
plt.show()

# ── train_loss vs val_loss(過学習の乖離)────────────
fig2, axes2 = plt.subplots(3, 1, figsize=(7, 14))
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('lr_overfit.png', dpi=150)
plt.show()

# ── 最終結果サマリー ─────────────────────────────────
print("\n===== 最終結果サマリー =====")
print(f"{'Pattern':>12} | {'Val Acc':>8} | {'Test Acc':>9} | {'Time(s)':>8}")
print("-" * 48)
for label in ['lr0.001', 'lr0.01', 'lr0.0001']:
    val_acc  = histories[label].history['val_accuracy'][-1]
    test_acc = scores[label][1]
    t        = times[label]
    print(f"{label:>12} | {val_acc:>8.4f} | {test_acc:>9.4f} | {t:>8.1f}")
print("-" * 48)

最終結果サマリー

===== 最終結果サマリー =====
     Pattern |  Val Acc |  Test Acc |  Time(s)
------------------------------------------------
     lr0.001 |   0.6510 |    0.6477 |    164.8
      lr0.01 |   0.5213 |    0.5246 |    130.2
    lr0.0001 |   0.4711 |    0.4704 |    123.7
------------------------------------------------

実験結果

精度グラフ

精度グラフ

精度グラフ

精度グラフ

A:lr=0.001(デフォルト)

A:lr=0.001(デフォルト)

B:lr=0.01(大きい)

B:lr=0.01(大きい)

C:lr=0.0001(小さい)

C:lr=0.0001(小さい)

最終結果サマリー

===== 最終結果サマリー =====
     Pattern |  Val Acc |  Test Acc |  Time(s)
------------------------------------------------
     lr0.001 |   0.6510 |    0.6477 |    164.8
      lr0.01 |   0.5213 |    0.5246 |    130.2
    lr0.0001 |   0.4711 |    0.4704 |    123.7
------------------------------------------------

結果サマリ

パターン 最終 val_accuracy 最終 test_accuracy 学習時間 収束の傾向
A:lr=0.001(デフォルト) 65.10% 64.77% 164.8秒 安定収束・まだ改善中
B:lr=0.01(大きい) 52.13% 52.46% 130.2秒 収束せず・頭打ち
C:lr=0.0001(小さい) 47.11% 47.04% 123.7秒 収束遅すぎ・30epでは足りない

考察

① lr=0.01(大きすぎる)の挙動

学習率が大きいとパラメータの更新量が大きくなり、損失関数の最適解を「飛び越えて」しまう現象が起きることがあります。val_lossが不安定に上下する・収束しないといった挙動が出やすいです。グラフで確認してください。

② lr=0.0001(小さすぎる)の挙動

学習率が小さいと更新量が小さいため、学習が安定する一方で収束が非常に遅くなります。30エポックでは精度が伸びきらず、デフォルト(0.001)より低い精度に終わる可能性があります。エポック数を増やせば精度は上がりますが、計算コストが大きくなります。

③ lr=0.001(デフォルト)が基準になる理由

Adamのデフォルト学習率0.001は多くのタスクで安定して動くよう設計されています。実験結果でデフォルトが他のパターンとどう違うかを確認し、「なぜ0.001が標準として使われているか」を数値で裏付けてください。

まとめ

  • 学習率は大きすぎると不安定・小さすぎると収束が遅いというトレードオフがある
  • Adamのデフォルト 0.001 は多くのタスクで最初に試すべき値
  • 精度が伸び悩む場合は 0.0001 に下げてエポック数を増やす、または学習率スケジューラの導入を検討する

関連記事もあわせてどうぞ: