こんにちは。
キャスレーコンサルティング・ID(インテグレーション・デザイン)部の金長です。

今回は、GoogleのTensorFlow(テンソルフロー)を使って、機械学習に触れてみたいと思います。

目次

TensorFlow(テンソルフロー)とは?
目的
動作環境
実装
動作確認
終わりに

TensorFlow(テンソルフロー)とは?

Googleが開発し、オープンソースとして公開されている機械学習用のライブラリになります。

以下のような用途で、利用されていたりします。(一部なので実際はたくさんあります)
・画像認識
・音声認識
・リアルタイム翻訳
・メール仕分け

Googleのサービスでも利用されているので、知らない内に使っている方は多いのではないでしょうか。

目的

TensorFlowを使って、機械学習の一連の流れを体験していきます。

TensorFlowでは、手書き文字の認識をやってみます。

文字認識には、手書き文字のデータセットとしては定番のMNIST(エムニスト)を使用します。
下記のような画像データと、正解のラベルデータから構成されています。

動作環境

windows10 64bit
Python 3.6.5
TensorFlow 1.10.1

実装

TensorFlowのチュートリアルmnist_softmax.pyのソースを利用しているため、
詳細はそちらを参照ください。

以下に、一部抜粋+日本語コメントを記載しております。

  # 画像データ
  x = tf.placeholder(tf.float32, [None, 784])
  # モデルの重み
  W = tf.Variable(tf.zeros([784, 10]))
  # モデルのバイアス
  b = tf.Variable(tf.zeros([10]))
  # ソフトマックス関数
  y = tf.nn.softmax(tf.matmul(x, W) + b)

  # 正解データ
  y_ = tf.placeholder(tf.int64, [None])

  # 損失関数(交差エントロピー)
  # 正解データに近づくように重み(w)を調整
  cross_entropy = tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=y)
  # 急速降下法
  train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
  
  # トレーニングの開始
  for _ in range(1000):
    # トレーニングデータからランダムに100個抽出
    batch_xs, batch_ys = mnist.train.next_batch(100)

    # 重みを更新
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

  # トレーニング結果の確認
  correct_prediction = tf.equal(tf.argmax(y, 1), y_)
  accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
  print(sess.run(
      accuracy, feed_dict={
          x: mnist.test.images,
          y_: mnist.test.labels
      }))

補足説明:
・MNISTデータの大きさは、縦横28画素であるため28×28=784となります。
・出力結果は、0〜9のいずれかとなるため重みは784×10の行列で表現されます。
・上記のモデルは、1層のみのニューラルネットワークであるため、
 ”ディープ”ラーニングではありません。
・活性化関数として、で表されるsoftmax関数を使用します。
・損失関数として、で表される交差エントロピー誤差を使用します。
・トレーニングデータ100個を用いた学習を1000回実施した後、
 検証用データを用いて正答率を表示します。

実行結果

0.9072(≒91%)
0.9076(≒91%)
0.9062(≒91%)
0.908(≒91%)
0.9062(≒91%)
5回実行してみた結果、多少の差異はありますが概ね91%の正解率になりました。

終わりに

いかがでしたでしょうか?
認識率91%自体は【低い】に分類されていますので、
次回は、CNN(畳み込みニューラルネットワーク)を使用して認識率が上がるのを試してみたいと思います。

金長
CSVIT事業部 ID(インテグレーション&デザイン)部 金長
新しいことにチャレンジすることが好きで、キャスレーに中途入社したエンジニアです! 現在は、エンジニア業務を行いつつ、画像解析&ビックデータなどの新規事業にも参画しています。