The MNIST database(Modified National Institute of Standards and Technology database)(以下, MNIST)は、0~9の手書き数字の画像データセットです(下図). Yann LeCun氏/Corinna Cortes氏/Christopher J.C. Burges氏によって, 手書き文字データセットのNISTデータベースから抽出&加工して作成されたサブセットです.
ChatGPT(Code Interpreter)に、
「tensorflowとMNISTを使って分類コードを作って」と入力するとコードが自動生成されますが、ここでは生成されたコードをjupyter labで実行した結果を示します。
なお、Code Interpreterを使用するには有料会員になる必要があります($20/month).
//ここから生成!
TensorFlowを使ってMNISTデータセットを用いた分類コードを作成します。MNISTは手書き数字のデータセットで、0から9までの数字が28x28ピクセルの画像として含まれています。このデータセットを使って数字の分類モデルを構築し、訓練してみましょう。
Pythonコードを以下に示します。TensorFlowのバージョンが2.xであることを前提としています。
```python
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
# MNISTデータをロードして、訓練用とテスト用に分割
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# データの前処理
train_images = train_images / 255.0
test_images = test_images / 255.0
# モデルの構築
model = Sequential([
Flatten(input_shape=(28, 28)), # 28x28の画像を1次元に変換
Dense(128, activation='relu'),
Dense(10, activation='softmax') # 出力層(0〜9の数字の分類なので10クラス)
])
# モデルのコンパイル
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# モデルの概要を表示
model.summary()
# モデルの訓練
model.fit(train_images, train_labels, epochs=5, batch_size=32, validation_split=0.2)
# テストデータを用いてモデルを評価
test_loss, test_accuracy = model.evaluate(test_images, test_labels)
print(f"Test accuracy: {test_accuracy}")
# 任意の画像で予測を試す場合
# prediction = model.predict(some_image_array)
# ここで、some_image_arrayは予測したい画像のnumpy配列で、サイズは(28, 28)である必要があります。
```
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_1 (Flatten) (None, 784) 0
dense_2 (Dense) (None, 128) 100480
dense_3 (Dense) (None, 10) 1290
=================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
_________________________________________________________________
Epoch 1/5
1500/1500 [==============================] - 2s 1ms/step - loss: 0.2886 - accuracy: 0.9176 - val_loss: 0.1551 - val_accuracy: 0.9578
Epoch 2/5
1500/1500 [==============================] - 2s 1ms/step - loss: 0.1269 - accuracy: 0.9622 - val_loss: 0.1152 - val_accuracy: 0.9652
Epoch 3/5
1500/1500 [==============================] - 2s 1ms/step - loss: 0.0871 - accuracy: 0.9744 - val_loss: 0.1037 - val_accuracy: 0.9695
Epoch 4/5
1500/1500 [==============================] - 2s 1ms/step - loss: 0.0660 - accuracy: 0.9798 - val_loss: 0.0879 - val_accuracy: 0.9719
Epoch 5/5
1500/1500 [==============================] - 2s 1ms/step - loss: 0.0510 - accuracy: 0.9844 - val_loss: 0.0869 - val_accuracy: 0.9739
313/313 [==============================] - 0s 1ms/step - loss: 0.0813 - accuracy: 0.9752
Test accuracy: 0.9751999974250793
```python
```
このコードでは、シンプルな2層のニューラルネットワークを構築しています。訓練データを使ってモデルを訓練し、テストデータを用いてモデルの性能を評価しています。5エポックの訓練を行っているので、必要に応じてエポック数を増減させることができます。
以上のコードを実行すると、MNISTデータセットに対する手書き数字の分類モデルが作成され、テストデータでの精度が表示されるはずです。 // ここまでが生成!
以上のようにMNISTとtensorflowを用いたシンプルな手書き数字の識別コードが出来上がり、十分な精度(0.975)が確認されました。
すぐに業務や研究用途で使用するのは難しいかもしれませんが、生成されたスクリプトを修正するなどして実用的なコードを開発することが可能ではないかと思います。
是非お試しください!
Comments