TensorFlow使ってみた~GoogleColab/MNIST~

TensorFlowとは

TensorFlowはGoogleが開発しオープンソースで公開している、機械学習に用いるためのフレームワークです。
「TensorFlow 使い方」とかでググるとバージョン1.0の時の記事が多くヒットしました。
しかし、現在2.0バージョンが公開されており、1.0の時の記事をそのまま実行してもうまくいきません。

しょうがない。 チュートリアル見て自分でやってみよう、となった次第。
そして、その備忘録。

www.tensorflow.org

ゼロから作るDeep LearningPythonで学ぶディープラーニングの理論と実装

オライリーが出しているDeepLearningの本です。 DeepLearningの基礎勉強として、この書籍を一通り追ってみたあと、TensorFlowに手を出してみようとした次第です。

チュートリアル

下記チュートリアルを参考に、オライリーでやったMNISTの画像認証を実装してみます。 www.tensorflow.org

チュートリアルに書いてあった通りGoogle Colabを使用しました。
Googleってやっぱりすごいな・・・

from __future__ import absolute_import, division, print_function, unicode_literals

# TensorFlow と tf.keras のインポート
import tensorflow as tf
from tensorflow import keras

# ヘルパーライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt

必要なライブラリ系のインポートを行います。

# MNISTの画像をインポート
mnist = keras.datasets.mnist

# 訓練データとテストデータを取得する
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 正規化
x_train = x_train / 255.0
x_test = x_test / 255.0

MNIST画像を取得します。
keras内に定義されている?ようで、1行で簡単に取得できます。

# モデルの定義
model = keras.Sequential([
    # インプット画像のレイヤ
    keras.layers.Flatten(input_shape=(28, 28)),
    # 隠れ層1層目のレイヤ(ノード数100、活性化関数にReLU関数を使用)
    keras.layers.Dense(100, activation='relu'),
    # 出力層のレイヤ(10クラス分類、出力関数にsoftmax関数を使用)
    keras.layers.Dense(10, activation='softmax')
])

モデルの定義をします。 つまり、ニューラルネットワークの定義と言ったらよいのでしょうか・・・
隠れ層の数や、隠れ層のノード数、活性化関数などを定義します。

# モデルのコンパイル
              # 最適化にADAMを使用
model.compile(optimizer='adam', 
              # 損失関数に交差エントロピー誤差を使用
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

上記で定義したモデルのコンパイルします。
ここで、最適化手法や、損失関数を指定します。

# モデルの訓練
model.fit(x_train, y_train, epochs=15)

fit関数で、モデルの学習を行います。 エポック数は15にしています。

# 正解率の評価
test_loss, test_acc = model.evaluate(x_test,  y_test, verbose=2)

print('\nTest accuracy:', test_acc)

テストデータに対して推論を行います。
正解率を出力しています。

実行結果

実行すると

Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 0s 0us/step
Epoch 1/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2714 - accuracy: 0.9227
Epoch 2/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.1226 - accuracy: 0.9632
Epoch 3/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0849 - accuracy: 0.9745
Epoch 4/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0656 - accuracy: 0.9796
Epoch 5/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0518 - accuracy: 0.9838
Epoch 6/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0423 - accuracy: 0.9866
Epoch 7/15
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0336 - accuracy: 0.9894
Epoch 8/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0281 - accuracy: 0.9912
Epoch 9/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0239 - accuracy: 0.9929
Epoch 10/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0204 - accuracy: 0.9940
Epoch 11/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0168 - accuracy: 0.9951
Epoch 12/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0139 - accuracy: 0.9958
Epoch 13/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0127 - accuracy: 0.9963
Epoch 14/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0108 - accuracy: 0.9970
Epoch 15/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0095 - accuracy: 0.9970

ここまでが、訓練フェーズの出力

313/313 - 0s - loss: 0.0900 - accuracy: 0.9792

Test accuracy: 0.979200005531311

これが、テストデータでの正答率の評価の出力です。

訓練データでの認証精度:99.7%
テストデータでの認証精度:97.92%

若干過学習になっている模様。
モデルの学習で繰り返し回数増やしすぎ・・・?

ともあれ、TensorFlowを使ってMNIST画像の認識を実装することができました。
ドキュメントもいろいろ用意されているので、どんどん掘り下げていきましょう。