• AI

はじめてのニューラルネットワーク

TensorFlow 2.0 Alpha に掲載されているファッション関連商品の画像データを利用してニューラルネットワークのプログラムを動かしてみました。

# tensorflowをKerasでモデル定義して使用
import tensorflow
from tensorflow import keras
import numpy as np

# jpupyter使用の場合
%matplotlib inline
import matplotlib.pyplot as plt

batch_size = 128
num_class = 10
epochs = 20

訓練データとテストデータの読み込み 
(訓練データ 60,000件)
(テストデータ 10,000件)

(x_train, y_train), (x_test, y_test) = keras.datasets.fashion_mnist.load_data()

最初の10件の訓練データを表示

for i in range(10):
    plt.subplot(2, 5, i+1)
    plt.title("Label: " + str(i))
    plt.imshow(x_train[i].reshape(28,28), cmap=None)
Image from Gyazo

Kerasを使用してTensorflowのモデル作成 (Kerasがあれば、かなり簡単に記述できます。)

x_train, x_test = x_train / 255.0, x_test / 255.0
for i in range(10):
    plt.subplot(2, 5, i+1)
    plt.title("Label: " + str(i))
    plt.imshow(x_train[i].reshape(28,28), cmap=None)
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy', metrics=['accuracy'])

学習を10回実施

history = model.fit(x_train, y_train, epochs=10)

[実行結果]

Epoch 1/10
60000/60000 [==============================] - 28s 465us/sample - loss: 0.5005 - acc: 0.8211
Epoch 2/10
60000/60000 [==============================] - 32s 534us/sample - loss: 0.3858 - acc: 0.8590 - loss: 0.3875
Epoch 3/10
60000/60000 [==============================] - 33s 554us/sample - loss: 0.3529 - acc: 0.8703 - loss: 0.3527 - acc: 0
Epoch 4/10
60000/60000 [==============================] - 32s 534us/sample - loss: 0.3292 - acc: 0.8772 - loss: 0.3290 - acc: 0 - ETA: 0s - loss: 0.3292 
Epoch 5/10
60000/60000 [==============================] - 34s 561us/sample - loss: 0.3139 - acc: 0.8832
Epoch 6/10
60000/60000 [==============================] - 37s 615us/sample - loss: 0.3024 - acc: 0.8876
Epoch 7/10
60000/60000 [==============================] - 34s 561us/sample - loss: 0.2909 - acc: 0.8919
Epoch 8/10
60000/60000 [==============================] - 39s 653us/sample - loss: 0.2825 - acc: 0.8948
Epoch 9/10
60000/60000 [==============================] - 39s 644us/sample - loss: 0.2719 - acc: 0.8984
Epoch 10/10
60000/60000 [==============================] - 33s 544us/sample - loss: 0.2635 - acc: 0.9017

正解率の測定

model.evaluate(x_test, y_test)

[実行結果]

10000/10000 [==============================] - 1s 107us/sample - loss: 0.3313 - 
acc: 0.8849

正解率は88%程度で改善の余地がありそうです。 28×28ピクセルの小さな画像データですが、さすがに60,000件のデータに対して10回の訓練を行うと、私のパソコンでは10分ほど時間が必要でした。 ニューラルネットワークのプログラム学習には高速演算を行えるGPU搭載のパソコンがあれば快適でしょう。

学習精度は88%となりましたが、テストデータの最初の10件の正解率を確認してみます。

# テストデータの最初の10件の画像を表示
for i in range(10):
    plt.subplot(1, 10, i+1)
    plt.title(str(i))
    plt.imshow(x_test[i].reshape(28,28), cmap=None)
Image from Gyazo
for i in range(10):
    pr = model.predict(x_test[i:i+1])
    print (np.argmax(pr))

[実行結果] (ラベルのみ出力)

9
2
1
1
6
1
4
6
5
7

このファッションデータのラベルは以下のようになっていますので、 最初の10個のデータは全問正解でした。

ラベルクラス
0T-シャツ/トップ (T-shirt/top)
1ズボン (Trouser)
2プルオーバー (Pullover)
3ドレス (Dress)
4コート (Coat)
5サンダル (Sandal)
6シャツ (Shirt)
7スニーカー (Sneaker)
8バッグ (Bag)
9アンクルブーツ (Ankle boot)
PAGE TOP