【ディープラーニング入門】手書き数字認識のためのMNISTデータセット活用法とサンプルコード!

※関数の書き方・実行結果に誤りがあるケースがあります。随時修正中です。また誤りに気づかれた方はこちらからご連絡頂きますとめちゃ嬉しいです。

目次

ディープラーニング入門の導入文

みんな、今日はディープラーニングの入門講座にようこそ!この講座では、手書きの数字を認識するという面白い課題に挑戦するで。ディープラーニングって聞くと、なんか難しそうに思えるかもしれんけど、実は身近なところでも使われてる技術なんや。

例えば、スマホのカメラで撮った写真に「この人は誰?」って教えてくれる機能や、SNSで自動的にタグをつけてくれるのもディープラーニングのおかげなんやで。これから、そんな技術を使って、手書きの数字をコンピュータに認識させる方法を学んでいこうと思うわ。

この講座を受けるメリットはいっぱいあるで!ディープラーニングの基礎を理解することで、画像認識や自然言語処理など、さまざまな分野に応用できるスキルが身につくんや。ほんで、最終的には自分のプロジェクトに活かすこともできるかもしれへん。さあ、早速始めていこうか!

① MNIST手書き数字データセットの紹介

さて、最初のステップとして、MNIST手書き数字データセットについて紹介するで。このデータセットは、手書きの数字(0から9まで)を集めたもので、ディープラーニングの入門にはもってこいの素材なんや!

MNISTデータセットの特徴

  • サイズ: MNISTデータセットには、60,000枚のトレーニング画像と、10,000枚のテスト画像が含まれてるで。これだけあれば、モデルをしっかりと訓練できるんや。

  • 画像の形式: 画像は28×28ピクセルのグレースケール(白黒)で、シンプルながらも数字を認識するには十分な情報が詰まってるんや。

  • ラベル: 各画像には対応するラベル(0から9の数字)が付いてるから、モデルがどれだけ正確に数字を認識できるかを評価することができるんや。

なんでMNISTを使うの?

  • 初心者向け: MNISTはディープラーニングの入門者が扱うには最適なデータセットや。シンプルな構造やから、基本的な技術を身につけるのにピッタリやで。

  • コミュニティのサポート: みんなが使っているデータセットやから、情報も豊富で学びやすい!問題にぶつかった時も、他の人の解決策を探しやすいんや。

  • 実績: 多くの研究やプロジェクトで使われていて、成功事例もたくさんあるから、実際のアプリケーションに役立てることもできるんや。

このMNISTデータセットを使って、手書きの数字を認識するためのモデルを作っていくで。次はデータの前処理について見ていこう!

② データの前処理:正規化とシェイプの調整

次に進むで!ディープラーニングのモデルを作る前に、データの前処理がめっちゃ重要なんや。今回は、MNISTデータセットの正規化とシェイプの調整について説明するわ。

正規化ってなんや?

正規化は、データの値を一定の範囲にスケーリングすることを指すんや。MNISTの画像は、0から255の範囲のピクセル値を持ってるんやけど、このままではモデルの学習がうまくいかんき、0から1の範囲にスケーリングするんや。

  • 何で正規化が必要なん?
  • 学習の安定化: 値が大きすぎると、勾配が爆発したり消失したりすることがあるから、正規化することで学習が安定するんや。
  • 収束が早くなる: スケールが揃うことで、モデルが早く収束することが期待できるで。

シェイプの調整

次に、シェイプの調整や。MNISTの画像は28×28ピクセルやけど、モデルに入力する際には形を整えなあかん。

  • シェイプの変更: ディープラーニングのライブラリによっては、画像を3次元のテンソル(バッチサイズ、幅、高さ、チャンネル)に変換する必要があるんや。MNISTの場合、モノクロやからチャンネル数は1やで。

具体的な前処理の流れ

ここで、実際の前処理のコードを見てみよう!

import numpy as np
from tensorflow.keras.datasets import mnist

# MNISTデータセットを読み込む
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 正規化:0-255の範囲を0-1にスケーリング
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0

# シェイプの調整:28x28の画像を(28, 28, 1)の形に変更
x_train = np.expand_dims(x_train, axis=-1)
x_test = np.expand_dims(x_test, axis=-1)

# 確認
print(x_train.shape)  # (60000, 28, 28, 1)
print(x_test.shape)   # (10000, 28, 28, 1)

このコードでは、MNISTデータを読み込んで、正規化とシェイプの調整を行ってるんや。これでデータがモデルに入力できる形になったで!次は、多層パーセプトロンモデルを構築していくで!

③ 多層パーセプトロンモデルの構築

さあ、次は多層パーセプトロン(MLP)モデルを構築していくで!MLPは、ディープラーニングの基本的なモデルの一つで、特に分類問題に効果的なんや。これを使って、手書き数字を認識するモデルを作っていこう!

MLPモデルの構成

多層パーセプトロンは、以下のような構成を持ってるで。

  • 入力層: 28×28ピクセルの画像を1次元の配列(784次元)に変換して入力するんや。
  • 隠れ層: 複数の隠れ層を持ち、各層でノード(ニューロン)が活性化関数を通じて計算を行うんや。隠れ層の数やノードの数は、モデルのパフォーマンスに影響を与えるで。
  • 出力層: 10個のノード(0から9までの数字)を持ち、各ノードはその数字に属する確率を出力するんや。

モデルの構築

ここで、実際にKerasライブラリを使ってMLPモデルを構築するコードを見てみよう!

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten

# モデルの初期化
model = Sequential()

# 入力層と隠れ層
model.add(Flatten(input_shape=(28, 28, 1)))  # 28x28の画像を1次元に変換
model.add(Dense(128, activation='relu'))      # 隠れ層1(128ノード)
model.add(Dense(64, activation='relu'))       # 隠れ層2(64ノード)

# 出力層
model.add(Dense(10, activation='softmax'))    # 10クラスの出力

# モデルのコンパイル
model.compile(optimizer='adam', 
              loss='sparse_categorical_crossentropy', 
              metrics=['accuracy'])

# モデルの概要を表示
model.summary()

このコードでは、以下のことをしてるで。

  • Sequentialモデルの作成: KerasのSequentialモデルを使って、層を順番に追加していくんや。
  • Flatten層: 画像を1次元に変換することで、隠れ層に入力できる形にするんや。
  • Dense層: 隠れ層と出力層を追加してるで。隠れ層ではReLU活性化関数を使い、出力層ではSoftmax活性化関数を使うんや。
  • コンパイル: モデルをコンパイルして、オプティマイザーや損失関数を設定するで。

これでMLPモデルが構築できたで!次は、このモデルを訓練して性能を評価していくで!

④ モデルの訓練と性能評価

さて、次は構築した多層パーセプトロン(MLP)モデルを実際に訓練して、その性能を評価していくで!ここでは、MNISTデータセットを使って、モデルがどれだけ正確に手書き数字を認識できるかを見ていくんや。

モデルの訓練

モデルを訓練するには、トレーニングデータを使ってパラメータを調整するんや。Kerasでは、fitメソッドを使って簡単に訓練できるで。

  • エポック数: モデルがデータ全体を何回学習するかを指定する値や。エポック数が多いほど、モデルはデータに対してより適応するんやけど、過学習にも注意が必要や。
  • バッチサイズ: 一度にモデルに与えるデータの数や。小さいバッチサイズは学習の安定性を高めるけど、計算コストが増えるで。

ここで、モデルを訓練するためのコードを見てみよう!

# モデルの訓練
history = model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.2)

このコードでは、以下のことをしてるで。

  • x_trainy_trainを使ってモデルを訓練してるんや。
  • エポック数は10、バッチサイズは32に設定してるで。
  • validation_splitを使って、トレーニングデータの20%を検証用データとして使うてるんや。

モデルの性能評価

訓練が終わったら、次はテストデータを使ってモデルの性能を評価するで。Kerasでは、evaluateメソッドを使って簡単に評価できるんや。

# テストデータでモデルの性能を評価
test_loss, test_accuracy = model.evaluate(x_test, y_test)

print(f"テストデータの損失: {test_loss:.4f}")
print(f"テストデータの精度: {test_accuracy:.4f}")

このコードでは、テストデータに対するモデルの損失と精度を計算しているで。これにより、モデルがどれだけうまく手書き数字を認識できるかがわかるんや。

訓練過程の可視化

最後に、訓練の過程を可視化して、モデルがどれだけ学習したかを見るためのコードも紹介するで。

import matplotlib.pyplot as plt

# 訓練過程の損失と精度をプロット
plt.figure(figsize=(12, 4))

# 損失のプロット
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='訓練損失')
plt.plot(history.history['val_loss'], label='検証損失')
plt.title('損失の推移')
plt.xlabel('エポック')
plt.ylabel('損失')
plt.legend()

# 精度のプロット
plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='訓練精度')
plt.plot(history.history['val_accuracy'], label='検証精度')
plt.title('精度の推移')
plt.xlabel('エポック')
plt.ylabel('精度')
plt.legend()

plt.show()

このコードでは、訓練過程での損失と精度の推移をグラフにプロットしているで。これにより、モデルのパフォーマンスがどう変化しているかを視覚的に確認できるんや。

これで、モデルの訓練と性能評価が完了したで!次は、予測結果の可視化と解釈に進むで!

⑤ 予測結果の可視化と解釈

さて、最後に進むで!訓練したモデルを使って、実際に手書き数字の予測を行い、その結果を可視化して解釈していくで。これが一番楽しみなところかもしれんね!

予測結果を取得する

まずは、テストデータを使ってモデルがどれだけ正確に数字を予測できるかを見てみよう。Kerasでは、predictメソッドを使って簡単に予測ができるんや。

# テストデータで予測を行う
predictions = model.predict(x_test)
predicted_classes = np.argmax(predictions, axis=1)  # 最も確率の高いクラスを取得

このコードでは、predictメソッドを使ってテストデータに対する予測を行い、argmaxを使って各画像に対して最も確率の高いクラス(数字)を取得してるで。

予測結果の可視化

次に、実際の画像と予測結果を可視化してみるで。これをすることで、モデルがどんな風に予測してるのかがわかるんや。ここでは、Matplotlibを使って画像を表示するで。

# 予測結果を可視化
import matplotlib.pyplot as plt

# 予測結果を表示する関数
def plot_predictions(images, true_labels, predicted_labels, num=10):
    plt.figure(figsize=(15, 5))
    for i in range(num):
        plt.subplot(2, 10, i + 1)
        plt.imshow(images[i].reshape(28, 28), cmap='gray')  # 28x28の画像に戻す
        plt.title(f"予測: {predicted_labels[i]}\n実際: {true_labels[i]}")
        plt.axis('off')
    plt.show()

# 予測結果をプロット
plot_predictions(x_test, y_test, predicted_classes, num=10)

このコードでは、plot_predictions関数を定義して、画像とその予測結果を並べて表示してるで。numパラメータで表示する画像の数を指定できるんや。

結果の解釈

可視化した結果を見て、モデルがどれだけ正確に数字を予測できているかを解釈していくで。以下のポイントに注意してみてな。

  • 正しく予測された画像: 正しい予測ができている画像は、モデルがうまく学習できている証拠や!
  • 誤った予測の画像: 誤った予測をした画像は、モデルが何を見逃したのか、もしくはデータにどんなバイアスがあるのかを考えるきっかけになるで。

これで、予測結果の可視化と解釈が完了したで!モデルがどれだけうまく動いているかを確認できたと思うわ。これからも、色んなデータセットやモデルに挑戦して、ディープラーニングの腕を磨いていこうな!お疲れさんでした!

【ディープラーニング入門】手書き数字認識のためのMNISTデータセット活用法とサンプルコード!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次