TensorFlow

【TensorFlow】TensorFlowによる手書き文字を分類するニューラルネットワークの実装。

どうも、とがみんです。

以前の記事で、TensorFlowを利用してプログラムを書く流れについて紹介しました。


この記事では、TensorFlowを利用して、ニューラルネットワークを構築し、手書き画像データを分類するシステムを作成していきます。

今回実装するものの概要

今回は、以下のような単純なニューラルネットワークを「TensorFlow」を利用して構築します。

手書き数字画像データの準備

手書き数字画像データの準備をしていきます。

それぞれのデータの形状を確認すると以下のような感じになってます。

画像データは縦×横=28ピクセル×28ピクセルで、学習用画像60000個、テスト用10000個あります。

データの前処理として、以下2つの処理を行います。

  1. 画像データを[28×28]の2次元データから、[1×748]の一次元データへ変換し、「0〜255」の値を「0〜1」へ変換
  2. 正解データを「1〜9」の数字ではなく、「one-hot表現」へ変換。

>整数値のベクトルをone hot表現に変換

データの形状は以下のように変換されます。

手書き数字画像データ分類ニューラルネットワークの実装

以下のステップで、ニューラルネットワークのプログラムを書いていきます。

  1. パラメータの準備
  2. 処理内容の定義
  3. 処理の実行プログラムの作成

パラメータの準備

入力データ、正解データを入れるようのプレースホルダーの準備と、各パラメータの初期化を行います。

プレースホルダー内の配列の型にNoneを指定しておくと、入力データのサイズが変わっても対応することができます。

truncated_normalは、ランダムな値を用意してくれます。

>Tensorflow API: tf.truncated_normal

処理内容の定義

各レイヤーの処理を記述します。

誤差関数、パラメータを最適化させる際に利用する関数、学習させる関数を記述します。

学習させるパラメータをvar_listに指定します。

認識精度を確認するための関数を記述します。

correct_predictionには、出力結果と正解データが同じであれば、True、異なれば、Falseを返します。

tf.castで、Bool型のデータを少数型に変換し、その平均をtf.reduce_meanで取ることによって、認識精度を計算しています。

処理の実行プログラムの作成

処理を実行するプログラムを書いていきます。値を保持しておくための配列を用意しておきます。

以下のコードを実行させると学習が始まります。

学習はバッチサイズを100とし、600回バッチ学習を行います。1エポック分の学習をさせています。

10バッチ毎の以下の値をそれぞれ出力してくれます。

  • 学習データに対する認識精度
  • テストデータに対する認識精度
  • 学習データの損失値
  • テストデータの損失値

学習結果

最後に学習の結果を表示します。

認識精度の推移

以下のコードで認識精度に関するグラフを表示します。

青は、学習用データに対する認識精度、オレンジはテストデータに対する認識精度についてです。

テストデータに対する最終的な認識精度は「95.29%」になりました。

損失関数の値の推移

以下のコードで、損失関数の値に関するグラフを表示します。

青は、学習用データに対する損失関数の値、オレンジはテストデータに対する損失関数の値についてです。

テストデータに対する最終的な損失値は「0.1531」になりました。

まとめ

TensorFlowを利用して、ニューラルネットワークを実装し、手書き文字の画像データの分類を行いました。

参考文献

>Get Started with TensorFlow|TensorFlow

>TensorFlowのチュートリアルをやってみる(1)

>TensorFlowで全結合ニューラルネットを実装+重みを取得する