手書きの数字認識を行うために、TensorFlowライブラリを使って神経ネットワークを構築する方法について、完全かつ包括的な記事を以下に示します。このプロジェクトは、MNISTデータセットを使用して手書き数字を認識するためのモデルを訓練することを目的としています。
1. TensorFlowと必要なライブラリのインストール
まず、TensorFlowライブラリをインストールします。TensorFlowは深層学習を行うための強力なツールで、手書き文字認識に非常に適しています。インストールは以下のコマンドで行います。

bashpip install tensorflow
また、データの前処理や結果の可視化のために、以下のライブラリも必要になります。
bashpip install matplotlib numpy
2. MNISTデータセットのロード
MNIST(Modified National Institute of Standards and Technology)データセットは、手書きの数字(0から9)で構成されている非常に有名なデータセットです。このデータセットはTensorFlowで簡単にロードできます。
pythonimport tensorflow as tf
from tensorflow.keras import layers, models
# MNISTデータセットをロード
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
# データの形状を確認
print(f"x_train shape: {x_train.shape}")
print(f"y_train shape: {y_train.shape}")
3. データの前処理
MNISTデータセットは、28×28のグレースケール画像です。これらの画像をニューラルネットワークに入力する前に、正規化(0〜1の範囲にスケーリング)を行います。
python# ピクセルの値を0〜1の範囲にスケーリング
x_train, x_test = x_train / 255.0, x_test / 255.0
4. モデルの構築
次に、ニューラルネットワークモデルを構築します。ここでは、簡単なシーケンシャルモデルを使用し、畳み込み層(Conv2D)とプーリング層(MaxPooling2D)を組み合わせて特徴を抽出し、全結合層(Dense)を使って最終的な分類を行います。
pythonmodel = models.Sequential([
# 畳み込み層とプーリング層を使って特徴を抽出
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
# Flatten層で1次元に変換
layers.Flatten(),
# 全結合層
layers.Dense(64, activation='relu'),
layers.Dense(10) # 出力層(0-9の数字に対応する10クラス)
])
# モデルの要約を表示
model.summary()
5. モデルのコンパイル
モデルが構築できたら、次にそのモデルをコンパイルします。損失関数にはSparseCategoricalCrossentropy
を使用し、最適化にはAdam
を使用します。さらに、精度(accuracy)を評価指標として設定します。
pythonmodel.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
6. モデルの訓練
コンパイルしたモデルを訓練データで学習させます。エポック数は5回程度に設定し、訓練を行います。
python# データを4次元テンソルに変換(グレースケール画像なのでチャネル数1)
x_train = x_train.reshape((x_train.shape[0], 28, 28, 1))
x_test = x_test.reshape((x_test.shape[0], 28, 28, 1))
# 訓練を開始
history = model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))
7. モデルの評価
訓練が完了した後、テストデータでモデルの精度を評価します。
pythontest_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_acc}")
8. 結果の可視化
訓練中の精度や損失の推移を可視化することで、モデルの学習の進行具合を確認できます。
pythonimport matplotlib.pyplot as plt
# 訓練と検証の精度をプロット
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legends()
plt.show()
9. モデルの予測
テストデータに対してモデルがどのように予測を行うかを確認します。
pythonimport numpy as np
# テストデータから最初の画像を選び、モデルの予測を行う
predictions = model.predict(x_test)
print(np.argmax(predictions[0])) # 最初の画像の予測結果
10. モデルの保存と再ロード
訓練が完了した後、モデルを保存して再利用することができます。
python# モデルの保存
model.save('handwritten_digit_model.h5')
# 保存したモデルの読み込み
new_model = tf.keras.models.load_model('handwritten_digit_model.h5')
まとめ
これで、手書きの数字認識を行うためのニューラルネットワークをTensorFlowを使って構築し、訓練、評価、予測のプロセスまでを完了しました。MNISTデータセットを使ったこの基本的なモデルは、手書きの数字を認識するための基礎を提供します。実際の応用に向けて、さらに高度なモデルや最適化手法を取り入れていくことが可能です。
TensorFlowを使った深層学習の基礎を学びながら、手書き文字認識という実際的なタスクに取り組むことができました。このようなモデルは、画像分類やOCR(光学式文字認識)など、さまざまな分野に応用できます。