見出し画像

AI・機械学習について学んでみた -その2-

その1では、y = ax + bに対して、xとyの情報を与え、傾きと切片を求めてもらうというプログラムを作成しました。
今回の記事では、MNISTデータセット上での手書き数字の分類モデルを構築し、訓練してみます。するためのものです。MNISTデータセットは、0から9までの手書き数字の28x28ピクセルのグレースケール画像からなっておます。


プログラムのソースと出力

今回作成したプログラムの内容は次のとおりです。

import tensorflow as tf
from tensorflow import keras

class myCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epochs, logs = None):
        if logs.get('accuracy') > 0.95:
            print("/Reached 95% accracy so cancelling training!")
            self.model.stop_training = True
callbacks = myCallback()

(training_images,training_labels
 ),(test_images, test_labels) = tf.keras.datasets.mnist.load_data()

training_images = training_images / 255
test_images = test_images / 255

model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape = (28,28)),
        tf.keras.layers.Dense(128,activation = tf.nn.relu),
        tf.keras.layers.Dense(10, activation = tf.nn.softmax)
])

model.compile(optimizer ='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(training_images, training_labels, epochs=5,
          callbacks = [callbacks])

model.evaluate(test_images,test_labels)

model.evaluate(test_images,test_labels)
classifications = model.predict(test_images)
print(classifications[0])
print(test_labels[0])

             ソースコードの中身

出力結果を示します。この結果は、テストデータ0番目のデータが衣類のラベル7である確率が一番高いと予測しています。

Epoch 1/5
1875/1875 [==============================] - 1s 392us/step - loss: 0.2552 - accuracy: 0.9253
Epoch 2/5
1758/1875 [===========================>..] - ETA: 0s - loss: 0.1094 - accuracy: 0.9676/Reached 95% accracy so cancelling training!
1875/1875 [==============================] - 1s 400us/step - loss: 0.1097 - accuracy: 0.9676
313/313 [==============================] - 0s 270us/step - loss: 0.1040 - accuracy: 0.9676
313/313 [==============================] - 0s 235us/step
[2.6691773e-06 4.4589605e-08 4.6675108e-05 8.7056583e-04 1.1671090e-07
 3.0956535e-06 3.2360897e-10 9.9886858e-01 5.5702048e-06 2.0264304e-04]
7

                出力結果

コードの詳細

1. インポート

import tensorflow as tf
from tensorflow import keras

TensorFlowとKerasライブラリをインポートします。

2. カスタムコールバックの定義

class myCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epochs, ›logs = None):
        if logs.get('accuracy') > 0.95:
            print("/Reached 95% accracy so cancelling training!")
            self.model.stop_training = True
callbacks = myCallback()

myCallback クラスは tf.keras.callbacks.Callback を継承しており、訓練の各エポックの終わりに呼び出される on_epoch_end メソッドをオーバーライドしています。このメソッド内で、logs.get('accuracy') > 0.95 (95 %以上の精度)をチェックし、これが True であれば訓練を停止します。これにより、十分な精度が得られたと判断した場合に無駄な計算を省略できます。

3. データのロードと前処理

(training_images,training_labels
 ),(test_images, test_labels) = tf.keras.datasets.mnist.load_data()

training_images = training_images / 255
test_images = test_images / 255

keras.datasets.mnist.load_data() を使用して MNIST データセットをロードし、訓練用とテスト用に分けます。続いて、画像データを 0 から 1 の範囲に正規化するために 255 で割っています。これは、ニューラルネットワークモデルの収束を早める一般的な前処理ステップです。

4. モデルの構築

model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape = (28,28)),
        tf.keras.layers.Dense(128,activation = tf.nn.relu),
        tf.keras.layers.Dense(10, activation = tf.nn.softmax)
])

tf.keras.models.Sequential を使用してモデルを定義しています。モデルは次に示す層で構成されています:

  1. Flatten 層:28x28 の画像を 784 (28 * 28) 要素のベクトルに変換します。

  2. Dense 層:128 ユニットの全結合層で、ReLU 活性化関数を使用します。

  3. Dense 層:10 ユニットの出力層で、ソフトマックス活性化関数を使用しています。これにより、10 クラスの分類問題(0 から 9 までの数字)に対する確率分布を得ることができます。

5. コンパイルと訓練

model.compile(optimizer ='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(training_images, training_labels, epochs=5,
          callbacks = [callbacks])

「model.compile メソッド」:
オプティマイザに adam を、損失関数に sparse_categorical_crossentropy を指定してモデルをコンパイルしています。また、メトリクスとして accuracy を指定しています。

「model.fit メソッド」:
モデルを訓練します。ここでは、訓練データ (training_imagestraining_labels)、エポック数 (epochs=5)、そして先ほど定義したカスタムコールバック (callbacks=[callbacks]) を指定しています。

6. モデルの評価と予測

model.evaluate(test_images,test_labels)
classifications = model.predict(test_images)
print(classifications[0])
print(test_labels[0])

model.evaluateメソッドでテストデータに対するモデルの性能を評価します。そして、model.predictメソッドでテスト画像に対する予測を行い、最初のテスト画像に対する予測されたクラスの確率分布(0から9)と、実際のラベルを出力しています。これにより、モデルがどの程度正確に数字を認識できるかを確認できます。

まとめ

今回の記事では、MINSTデータを用いてその画像データの学習とその学習結果に基づいたテスト画像を予測させてみました。まだ、学習中で内容をきちんと理解できていない部分があります。

この記事が気に入ったらサポートをしてみませんか?