TensorFlow使ってみた~GoogleColab/MNIST~
TensorFlowとは
TensorFlowはGoogleが開発しオープンソースで公開している、機械学習に用いるためのフレームワークです。
「TensorFlow 使い方」とかでググるとバージョン1.0の時の記事が多くヒットしました。
しかし、現在2.0バージョンが公開されており、1.0の時の記事をそのまま実行してもうまくいきません。
しょうがない。
チュートリアル見て自分でやってみよう、となった次第。
そして、その備忘録。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
オライリーが出している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画像の認識を実装することができました。
ドキュメントもいろいろ用意されているので、どんどん掘り下げていきましょう。