Tensorflow+Kerasのチュートリアルを動かしてみる

はじめに

前回、Tensorflowをインストールした環境を構築したので、チュートリアルを動かしてみます。

ソースコード

チュートリアルのソースをコピーして動かしてみました。

import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])

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

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

処理の概要

チュートリアルの処理が何をしているか調べてみました。

TensorflowにはMNIST(手書き数字の分類)が内蔵されており、その機能を読み込んでいます。

mnist = tf.keras.datasets.mnist

画像データを読み込んで、各変数に設定しています。
x_train:MINISTのトレーニング用の画像データ
y_train:MINISTのトレーニング用の正解ラベル
x_test:MINISTのテスト用の画像データ
y_test:MINISTのテスト用の正解ラベル

(x_train, y_train),(x_test, y_test) = mnist.load_data()

画像データは0~255までの数字が入っており、そのままだと扱いにくいので255で割って、0~1に値にしています。(正則化)

x_train, x_test = x_train / 255.0, x_test / 255.0

Sequentialに層を積み重ねていきます。

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])

MNISTの画像データは28×28のデータが入っており、それを784の平らなデータにしています。

tf.keras.layers.Flatten()

中間層のノードを512に設定しています。(中間層をいくつにするかは難しい問題みたいですが、このチュートリアルでは512になっています。)
activation(活性化関数)にreluを指定しています。

tf.keras.layers.Dense(512, activation=tf.nn.relu)

20%のデータを取り除きます。過学習を防ぐ意味があるようです。

tf.keras.layers.Dropout(0.2)

MNISTは0~9までの手書き数字の分類なので、10個の出力層を定義しています。
activation(活性化関数)にsoftmaxを指定しています。
softmaxを使うと、0~9のそれぞれの数字の確率を計算してくれます。

tf.keras.layers.Dense(10, activation=tf.nn.softmax)

model.compileでモデルを定義します。ここでいうモデルは計算式という理解で良いと思います。
optimizer=’adam’:adamという最適化アルゴリズムを指定しています。
loss=’sparse_categorical_crossentropy’:sparse_categorical_crossentropyという損失関数を指定しています。
metrics=['accuracy’]:評価項目を設定します。ここでは分類の精度を評価項目に設定しています。

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

model.fitで学習を実行しています。epochs=5は学習を5回実行するという意味です。

model.fit(x_train, y_train, epochs=5)

実行すると、以下のような結果になりました。
loss:推定値と正解の誤差
acc:正解率(正しく分類できた確率)

Epoch 1/5
60000/60000 [==============================] - 14s 234us/step - loss: 0.2034 - acc: 0.9407
Epoch 2/5
60000/60000 [==============================] - 13s 211us/step - loss: 0.0808 - acc: 0.9753
Epoch 3/5
60000/60000 [==============================] - 13s 213us/step - loss: 0.0528 - acc: 0.9834
Epoch 4/5
60000/60000 [==============================] - 13s 210us/step - loss: 0.0372 - acc: 0.9879
Epoch 5/5
60000/60000 [==============================] - 13s 215us/step - loss: 0.0285 - acc: 0.9906

テスト用データでどれくらいの精度で分類できるかを実行します。

model.evaluate(x_test, y_test)

実行

以下のような結果になりました。

[0.06659783991681179, 0.9802]

補足

VS Codeでmodel.evaluateの結果を見るためには、以下のようにする必要がありました。

loss, accuracy = model.evaluate(x_test, y_test)
print("accuracy = {:.4f}".format(accuracy))