Fresopiya
場所にもお金にも時間にも、何にも縛られない自由な状態になったら一体人間は何をしてどこに向かうのか。 まずはとにかく自由を目指すエンジニアのブログです。

哲学とプログラミングとブログがメインになるかと。
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で全結合ニューラルネットを実装+重みを取得する