[ 機械学習 ] TensorFlowでMNIST画像識別の実装

[ 機械学習 ] TensorFlowでMNIST画像識別の実装

本記事では、TensorFlowを使用してMNIST画像識別を実装していきます。

TensorFlowとは?

TensorFlowとは、Googleが開発した機械学習用のライブラリです。テンサーフロー、またはテンソルフローと読みます。
テンソルとは多次元配列のことを意味し、その名の通り多次元の配列を取り扱うことで一般的な機械学習や高度のディープラーニングなどを実装することが出来ます。

誰でも使える、と言うよりは機械学習についてある程度理解がある人に向けたライブラリと言えます。モデルについての理解が全くない状態で触るには少し難易度が高いかもしれません。

以下、公式ホームページです。

 

https://www.tensorflow.org

 

本記事の趣旨

前回は、ほぼ全ての機能を自作してMNISTの画像識別を実装しました。

が、機械学習のような深遠な世界で既存ライブラリを使用しないのは賢明とは言えません。

ですので、前回と同様の実装をTensorFlowと言うライブラリを使用して行ってみようと言うのが今回の趣旨となります。

どれだけ記述量が減るのか、また損失の減り方はどれだけスマートになるのか、などを確認するのが個人テーマです。

実装

では早速ですが実装を行っていきます。

最初に仕様を確認した後、いくつかの段階に分けてコーディングを行います。

仕様

基本的には前回と同様です。

 

入力データ仕様

名称:MNIST
全データ数:70000
データ形状:28 x 28 の画像データ
データ性質:1 ~ 9 の手書き文字データ

 

出力データ仕様

出力:読み込んだデータが 1 ~9 のどの文字であるかを判定する確率

 

ネットワーク仕様

入力層
:70000 * 0.8 行 (70000データのうち、8割程度を抜き出して訓練用データとして扱う)
:784列 (ニューラルネットワークでは多次元データを扱えないため、28 * 28 の配列を reshape して784に変換する)

隠れ層:3層
⇨1層目:ニューロン数50:活性化関数=シグモイド
⇨2層目:ニューロン数30:活性化関数=シグモイド
⇨3層目:ニューロン数10:活性化関数=ソフトマックス

出力層:1行10列(各列がそれぞれの数値に対する判定確率となる)

1.データの準備

データの準備についても、基本的には前回と同じです。

画像データの値範囲が 0~255 となっているので、それを 0 ~ 1 に収まるように標準化し、正解データの方にはOne-Hot-Encodingを施します。

2. モデルの作成

ここからは前回と異なります。

まず、TensorFlow内のKerasライブラリを使用し、Sequenatil クラスと Dense クラスをimportします。

Sequential クラスはモデル全体の定義であり、この中に各層の定義を追加していきます。
このモデルに対して、add メソッドを使用することで層の定義を追加することができます。

Dense クラスは層の定義です。Sequentialクラスに追加することで、モデル内の隠れ層として機能します。
このクラスの定義時には、次の項目を設定します。

  • units
    対象の層に持たせるニューロンの数です。
  • input_shape
    その層へ入力される値の形状。1層目だけ定義してやれば、後ろの層については自動で計算されます。
  • activation
    仕様する活性化関数。sigmoid や relu と言った文字列を渡すことで、指定の活性化関数が使用されます。

今回は3層構成のモデルを構築するので、一つのSequentialに対して3つのDenseをaddします。

3. 学習の実施

上記のコードだけでモデルの定義は終了しました。
あとはモデルに学習を行うだけです。

学習を行うに当たって、二つの手順を踏みます。

一つは、損失計算の方法の指定です。
これは、Sequentialクラスの compile メソッドでもって行います。
ここで設定する項目は次の通りです。

  • optimizer
    モデルを最適化するためのアルゴリズムです。通常の勾配法を用いる場合には、SGDを指定します。
  • loss
    損失計算のアルゴリズムです。ここでは交差エントロピー誤差を指定しています。
  • metrics
    評価指標の指定です。ここでは、予測と正解の一致率を表現する accuracy を指定しています。

 

もう一つは、学習に必要な情報を定義です。
これには、Sequentialクラスの fit メソッドを使用します。
ここで設定する項目は次の通りです。

  • x_train
    使用する訓練データです。
  • y_train
    訓練データに対応する正解データです。
  • batch_size
    一度の学習で仕様するデータのサイズです。
  • epochs
    学習を繰り返す数です。
  • validation_split
    訓練データの分割率です。訓練データを指定した割合で分割しチェックを行うことで、過学習に陥ることを防ぎます。
  • callbacks
    ログ関連の指定です。

 

以上が必要な情報となります。
ここでは TensorBoard と言う機能も使用していますが、ログの出力に関する機能なので今回は説明を割愛します。

上記のようにモデルの学習を行うと、学習ログが出力されます。

学習が進むにつれて、損失が順調に減少していくことが見て取れます。

4. 予測の実行

以上で学習、すなわちモデルの最適化が終了しました。

最後に、画像の識別を行えているかを実践してみます。

ここでは3種類のデータについて、正解ラベルとモデルによる予測結果を比較してみています。
いずれについても、正解を求められていることが下のログからわかります。

 

 

結果まとめ

以上で、TensorFlow用いたMNIST画像識別の実装が終了しました。

触ってみてわかるのは、モデルの構築の簡単さと、学習の容易さです。
モデルの層の追加はパズルを組み合わせるように直感的にできますし、学習の実行も数行のコードだけで行うことができます。

どのように組み合わせるか、やどの関数を指定するか、などの点で知識は必要となってしまいますが、それさえ判断できればとても有用なライブラリだと言うことが分かりました。

また、今回は触れられませんでしたがTensorFlowはモデルの可視化にも役立つと聞いています。
次回以降、その可視化機能についても触れることでもっと分かり良いモデル構築を行っていきたいと思います。

 

以上。

MachineLearningカテゴリの最新記事