各クラス10枚だけでAIモデルを学習させたら、どこまで認識できるのか?

2025年5月21日水曜日

Google Colab Keras TensorFlow 画像分類 機械学習

X f B! P L

はじめに

こんにちは、SHOUです!

今回は、「各クラス10枚だけでAIモデルを学習させたら、どこまで認識できるのか?」という実験をしてみました。
データを集めるのが大変なとき、小規模なデータでもモデルを動かしたいときってありますよね。

実験の条件

  • クラス数:10(0〜9の手書き数字)
  • 1クラスあたりの画像数:10枚(合計100枚)
  • モデル:Kerasによる多層パーセプトロン
  • 学習環境:Google Colab + GPU
  • データ拡張:あり(回転・ズーム・シフトなど)

学習の様子

データは合計100枚と非常に少ないため、ImageDataGeneratorを使って水増し(データ拡張)を行いました。

データ拡張

  1. #Google Driveをマウント
  2. from google.colab import drive
  3. drive.mount('/content/drive')
  4. from tensorflow.keras.preprocessing.image import ImageDataGenerator
  5. # データ拡張の設定
  6. datagen = ImageDataGenerator(
  7. rescale=1./255, # 正規化
  8. preprocessing_function=lambda x: 1.0 - x, # 白黒反転
  9. rotation_range=30, # 回転
  10. width_shift_range=10, # 横移動
  11. height_shift_range=10, # 縦移動
  12. zoom_range=0.1, # ズーム
  13. shear_range=0.1, # 傾き
  14. validation_split=0.2 # 検証データ分割
  15. )
  16. train_generator = datagen.flow_from_directory(
  17. '/content/drive/MyDrive/Colab/digits',
  18. target_size=(28, 28),
  19. color_mode='grayscale',
  20. batch_size=32,
  21. class_mode='sparse',
  22. subset='training',
  23. shuffle=True
  24. )
  25. val_generator = datagen.flow_from_directory(
  26. '/content/drive/MyDrive/Colab/digits',
  27. target_size=(28, 28),
  28. color_mode='grayscale',
  29. batch_size=32,
  30. class_mode='sparse',
  31. subset='validation'
  32. )

学習

  1. import tensorflow as tf
  2. from tensorflow import keras
  3. model = keras.models.Sequential([
  4. keras.layers.Input(shape=(28, 28, 1)),
  5. keras.layers.Flatten(),
  6. keras.layers.Dense(128, activation='relu'),
  7. keras.layers.Dropout(0.3),
  8. keras.layers.Dense(10, activation='softmax')
  9. ])
  10. model.compile(optimizer='adam',
  11. loss='sparse_categorical_crossentropy',
  12. metrics=['accuracy'])
  13. # 学習
  14. history = model.fit(train_generator,epochs=30,validation_data=val_generator)

このようにして、少ない画像でもバリエーションを増やし、学習を進めました。

学習結果

  1. Epoch 1/30
  2. 3/3 ━━━━━━━━━━━━━━━━━━━━ 2s 273ms/step - accuracy: 0.0432 - loss: 2.9863 - val_accuracy: 0.1500 - val_loss: 2.4238
  3. Epoch 2/30
  4. 3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 190ms/step - accuracy: 0.0625 - loss: 2.7927 - val_accuracy: 0.0500 - val_loss: 2.3816
  5. Epoch 3/30
  6. 3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 149ms/step - accuracy: 0.0688 - loss: 2.5960 - val_accuracy: 0.1500 - val_loss: 2.3417
  7. Epoch 4/30
  8. 3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 156ms/step - accuracy: 0.1023 - loss: 2.4672 - val_accuracy: 0.1000 - val_loss: 2.3062
  9. Epoch 5/30
  10. ・・・
  11. Epoch 26/30
  12. 3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 175ms/step - accuracy: 0.0646 - loss: 2.3042 - val_accuracy: 0.1000 - val_loss: 2.3020
  13. Epoch 27/30
  14. 3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 194ms/step - accuracy: 0.1177 - loss: 2.3022 - val_accuracy: 0.0500 - val_loss: 2.3025
  15. Epoch 28/30
  16. 3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 146ms/step - accuracy: 0.1203 - loss: 2.3023 - val_accuracy: 0.1000 - val_loss: 2.3026
  17. Epoch 29/30
  18. 3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 160ms/step - accuracy: 0.0932 - loss: 2.3028 - val_accuracy: 0.1000 - val_loss: 2.3026
  19. Epoch 30/30
  20. 3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 153ms/step - accuracy: 0.0818 - loss: 2.3028 - val_accuracy: 0.1000 - val_loss: 2.3026

学習ログを見ると、「学習しているように見えて、実はほぼ何も学習していない」という状態となっています。

  • accuracy: ~0.08 〜 0.15
  • val_accuracy: 0.05 〜 0.15
  • loss: ≈ 2.30

📝 まとめ:画像が少なすぎるとAIは学習できない

今回の検証から、1クラス8枚、全体で80枚という極端に少ないデータでは、AIモデルはほとんど学習できないことが明確になりました。 実際のログでは、精度や損失が改善せず、「学習しているように見えて何もしていない」状態が続いていました。

🔍 原因の本質

  • 学習画像が極端に少ない(各クラス8枚)
  • 検証データも各クラス2枚では評価できない

✅ 有効な対策

  1. 事前学習を有効にする
    MNISTなどの大規模データセットでまず学習し、その後に自作データでファインチューニングする。
  2. モデル構造をCNNに変更
    画像の空間的特徴を活かすConv2D構造を使用。
    1. model = keras.models.Sequential([
    2. keras.layers.Input(shape=(28, 28, 1)),
    3. keras.layers.Conv2D(32, (3, 3), activation='relu'),
    4. keras.layers.MaxPooling2D((2, 2)),
    5. keras.layers.Conv2D(64, (3, 3), activation='relu'),
    6. keras.layers.MaxPooling2D((2, 2)),
    7. keras.layers.Flatten(),
    8. keras.layers.Dense(64, activation='relu'),
    9. keras.layers.Dense(10, activation='softmax')
    10. ])
  3. データ拡張をさらに強化(オプション)
    水増しは補助的な手法だが、効果はある。
    1. datagen = ImageDataGenerator(
    2. rescale=1./255,
    3. preprocessing_function=lambda x: 1.0 - x,
    4. rotation_range=40,
    5. width_shift_range=0.3,
    6. height_shift_range=0.3,
    7. zoom_range=0.2,
    8. shear_range=0.2,
    9. validation_split=0.2
    10. )

🎯 結論:データ量は正義。少なすぎるなら戦略が必要

画像分類AIを学習させるには、最低でも各クラス50〜100枚は必要です。
少量しか集められない場合は、事前学習+CNN+ファインチューニングを組み合わせて精度を引き出しましょう。

次回は、実際に「事前学習+CNN」の構成で再学習し、どこまで改善されるかを検証していきます!

このブログを検索

自己紹介

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

お問い合わせフォーム

名前

メール *

メッセージ *

プライバシーポリシー

QooQ