🐘

【図解】KerasでMNIST画像分類

2022/08/28に公開

はじめに

深層学習フレームワーク「Keras」を使って、画像分類 AI を作ります。
今回は、サンプルデータ「MNIST」を使用します。
手書き数字の画像(28×28px)が 10 クラスのどれに当てはまるかを分類します。

01 準備

必要なライブラリ
requirements.txt
numpy
tensorflow

02 コード全文

コード全文
clf_mnist.py
import numpy as np
from tensorflow import keras
from tensorflow.keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.summary()

print("\n◆Train:")
model.fit(train_images, train_labels, epochs=10)
print("Done")

print("\n◆Predict:")
predictions = model.predict(test_images, verbose=1)
num = 2
result = np.argmax(predictions[num])
print(f"The result of image {num} is [{result}].")

print("\n◆Evaluate:")
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=1)
print(f"Test accuracy:{100 * test_acc:5.2f}%")

03 出力結果

出力結果
result
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 flatten (Flatten)           (None, 784)               0

 dense (Dense)               (None, 128)               100480

 dense_1 (Dense)             (None, 10)                1290

=================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
_________________________________________________________________

◆Train:
Epoch 1/10
1875/1875 [==============================] - 2s 1ms/step - loss: 2.9254 - accuracy: 0.8558
Epoch 2/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.4251 - accuracy: 0.9022
Epoch 3/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.3081 - accuracy: 0.9235
Epoch 4/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.2524 - accuracy: 0.9345
Epoch 5/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.2366 - accuracy: 0.9409
Epoch 6/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.2128 - accuracy: 0.9462
Epoch 7/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.2112 - accuracy: 0.9476
Epoch 8/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.1913 - accuracy: 0.9516
Epoch 9/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.1903 - accuracy: 0.9522
Epoch 10/10
1875/1875 [==============================] - 2s 1ms/step - loss: 0.1896 - accuracy: 0.9528
Done

◆Predict:
313/313 [==============================] - 0s 800us/step
The result of image 2 is [1].

◆Evaluate:
313/313 [==============================] - 0s 915us/step - loss: 0.3369 - accuracy: 0.9410
Test accuracy:94.10%


サクッと試したい方は、上記の内容をもとに実行してみてください。
以下はもっと深く理解したい方に向けた、詳しい解説です。

解説

step01 ライブラリの読み込み

clf_mnist.py (1〜3行目)
import numpy as np
from tensorflow import keras
from tensorflow.keras.datasets import mnist

必要なライブラリを読みこみます。今回必要なのは 2 つです。

  • numpy : 配列計算をするためのライブラリ。
  • tensorflow : ディープラーニングをするためのライブラリ(フレームワーク)。

tensorflow から、keras フレームワークと、mnist データセットを読み込んでいます。これらは後ほど使います。


step02 サンプルデータの読み込み

clf_mnist.py (4行目)
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

データを取り込むためのコードです。keras にはサンプルのデータセットが用意されていて、その 1 つに「mnist」があります。
上記のコードを実行することで、mnist データセットをプログラム内で使えるようになります。データは 4 つに分けて取り込み、内容は次の通りです。

  1. train_images : 学習データ
  2. train_labels : 学習データの正解ラベル
  3. test_images : テストデータ
  4. test_labels : テストデータの正解ラベル

データを 4 つに分けておくことで、この後の作業がやりやすくなります。

【補足】データのサイズと型を確認するコード

これらのデータの、サイズと型は以下のようなコードで確認することができます。

補足コード:配列のサイズと型を表示
print("\n◆学習データ:")
print(f"train_images : {train_images.shape}, {type(train_images)}")
print(f"train_labels : {train_labels.shape}, {type(train_labels)}")
print("\n◆テストデータ:")
print(f"test_images : {test_images.shape}, {type(test_images)}")
print(f"test_labels : {test_labels.shape}, {type(test_labels)}")
結果

◆学習データ:
train_images : (60000, 28, 28), <class 'numpy.ndarray'>
train_labels : (60000,), <class 'numpy.ndarray'>

◆テストデータ:
test_images : (10000, 28, 28), <class 'numpy.ndarray'>
test_labels : (10000,), <class 'numpy.ndarray'>

28×28 ピクセルの画像が 70,000 枚含まれていて、その内の 60,000 枚が学習データ、10,000 枚がテストデータとして使用されます。また、それぞれに対応した正解ラベルがついています。


step03 モデルの作成

clf_mnist.py (5〜9行目)
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

上記のコードにより、モデルを作成することができます。最終的に作られるのは、modelという名前のインスタンスです。これが AI そのものになります。この時点では学習していないため、まだ AI とは呼べません。

上記で作ったモデルは、次のような構造をしています。

  • 1 層目 : 784 ニューロン
  • 2 層目 : 128 ニューロン(活性化関数 : relu)
  • 3 層目 : 10 ニューロン(活性化関数 : softmax)

入力層のkeras.layers.Flattenでは、28x28 ピクセルの画像を一列に並べ直しているレイヤーです。入力するデータセットのサイズによって変わります。今回は mnist データセットを使用するので、28x28=784 ニューロンとなります。
次の層では、keras.layers.Denseを使っているため、入力層と全結合でつながっています。ニューロン数は、引数で指定した 128 ニューロンです。なお、活性化関数にはrelu関数を使っています。
最後の層では、keras.layers.Denseを使っているため、2層目と全結合でつながっています。ニューロン数は、引数で指定した 10 ニューロンです。10 ニューロンにした理由は、最終的に分類したいクラス数が 10 クラスだからです。なお、活性化関数にはsoftmax関数を使っています。これにより、最終的な結果を、確率の表示で出力してくれます。


step04 モデルの設定

clf_mnist.py (10〜12行目)
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

.
.
.


続きの内容は本にまとめてあります。手に取って頂けるととても喜びます ↓
https://zenn.dev/nekoallergy/books/deeplearning-advanced

人工知能/AI/機械学習をもっと詳しく

ねこアレルギーのAI

ねこアレルギーの AI
YouTube で機械学習について発信しています。お時間ある方は覗いていただけると喜びます。



Created by NekoAllergy

Discussion