【図解】KerasでMNIST画像分類
はじめに
深層学習フレームワーク「Keras」を使って、画像分類 AI を作ります。
今回は、サンプルデータ「MNIST」を使用します。
手書き数字の画像(28×28px)が 10 クラスのどれに当てはまるかを分類します。
01 準備
必要なライブラリ
numpy
tensorflow
02 コード全文
コード全文
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 出力結果
出力結果
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 ライブラリの読み込み
import numpy as np
from tensorflow import keras
from tensorflow.keras.datasets import mnist
必要なライブラリを読みこみます。今回必要なのは 2 つです。
- numpy : 配列計算をするためのライブラリ。
- tensorflow : ディープラーニングをするためのライブラリ(フレームワーク)。
tensorflow から、keras フレームワークと、mnist データセットを読み込んでいます。これらは後ほど使います。
step02 サンプルデータの読み込み
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
データを取り込むためのコードです。keras にはサンプルのデータセットが用意されていて、その 1 つに「mnist」があります。
上記のコードを実行することで、mnist データセットをプログラム内で使えるようになります。データは 4 つに分けて取り込み、内容は次の通りです。
- train_images : 学習データ
- train_labels : 学習データの正解ラベル
- test_images : テストデータ
- 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 モデルの作成
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 モデルの設定
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
.
.
.
続きの内容は本にまとめてあります。手に取って頂けるととても喜びます ↓
人工知能/AI/機械学習をもっと詳しく
ねこアレルギーの AI
YouTube で機械学習について発信しています。お時間ある方は覗いていただけると喜びます。
Created by NekoAllergy
Discussion