TensorFlowのチュートリアルMNIST For ML Beginnersを試してみる。

プログラミングの世界では、最初に「Hello World」と表示される非常に小さいプログラムを書くことが伝統となっている。
機械学習では、この「Hello World」の代わりに、MNISTを実行するのが伝統のようだ。

MNISTは、手書きの数字の画像のデータセットである。

ここでの目的は、手書きの数字の画像がどのような数字かを予測するモデルを構築することである。

input_data.pyの取得

最初に、tensorflow/input_data.py at r0.8 · tensorflow/tensorflow · GitHubから、表示されているコードをコピーして、適当なテキストエディタにペーストして、input_data.pyとして保存しておく。

このinput_data.pyは、データをウェブ上から取得したり、データを扱いやすいよう加工してくれる。

MNISTの手書き画像データのダウンロード

続いて、MNISTの手書き画像データをダウンロードをする。
上記にも記載したが、ここでは、先に手動でダウンロードしておくことにする。

MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burgesから、次のファイルをダウンロードする。

train-images-idx3-ubyte.gz: training set images (9912422 bytes)
train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)

チュートリアルの実行

適当にワークスペースを作成し、次のようなファイル、ディレクトリ構成にしておく。
下のコードをtutorial.pyとして保存する。


workspace
    |-MNIST_data
    |    |-train-images-idx3-ubyte.gz
    |    |-train-labels-idx1-ubyte.gz
    |    |-t10k-images-idx3-ubyte.gz
    |    |-t10k-labels-idx1-ubyte.gz
    |-input_data.py
    |-tutorial.py

MNIST_dataディレクトリ以下に、MNISTの手書き画像データがない場合は、input_data.read_data_sets関数内で、ダウンロードされる。


import tensorflow as tf
import input_data

# MNISTデータを読み込み
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 画像データ
x = tf.placeholder("float", [None, 784])

# モデルの重み
W = tf.Variable(tf.zeros([784, 10]))

# モデルのバイアス
b = tf.Variable(tf.zeros([10]))

# トレーニングデータxとモデルの重みWを乗算した後、モデルのバイアスbを足し、
# ソフトマックス回帰(ソフトマックス関数)を適用
y = tf.nn.softmax(tf.matmul(x, W) + b)

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

# 損失関数をクロスエントロピーとする
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))

# 学習係数を0.01として、勾配降下アルゴリズムを使用して、
# クロスエントロピーを最小化する
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

# 変数の初期化
init = tf.initialize_all_variables()

# セッションの作成
sess = tf.Session()

# セッションの開始および初期化の実行
sess.run(init)

# トレーニングの開始
for i 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})

# 予測値と正解値を比較して、bool値(true or false)にする
# tf.argmax(y, 1)は、予測値の各行で、最大値となるインデックスを一つ返す
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

# bool値を0 or 1に変換して平均値をとる -> 正解率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

# テストデータを与えて、テストデータの正解率の表示
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

このtutorial.pyを実行すると、次のように表示された。
これは、トレーニングデータから構築された予測モデルに、テストデータを当てはめたところ、およそ91%の正解率であるということである。
もちろん、その時その時で多少変動する。


$ python3 tutorial.py
・・・
0.9113

関連する記事

  • Ubuntu apt-getでRがアップデートできない場合の対処法Ubuntu apt-getでRがアップデートできない場合の対処法 apt-getコマンドでRがアップデートできない理由はいくつか考えられる。ここでは、アップデートできない原因別に対処法をお伝えする。 接続できない 「apt-get […]
  • Ubuntu TensorFlowのGPU版をpipでインスールする手順Ubuntu TensorFlowのGPU版をpipでインスールする手順 Ubuntu上で、TensorFlowのGPU版をpipでインストールする手順をお伝えする。 TensorFlowのバージョン0.6.0からPython3が使えるようになったので、Python3を用いることにする。 ここに記載されていることの大部分は、TensorFlowのDownload and […]
  • Bioconductor HeatplutsパッケージのregHeatmapで文字の大きさを変えるBioconductor HeatplutsパッケージのregHeatmapで文字の大きさを変える BioconductorのHeatplusパッケージのregHeatMap関数を用いると、ヒートマップを描けるが、行と列の文字の大きさを変える方法が分かり難かったので、備忘録として残しておく。 サンプルデータのために、Biobaseパッケージをインストールしておく。 > […]
  • 平均的に分類する方法の考察(1)平均的に分類する方法の考察(1) ある定量データが与えられたとき、それを平均的に分類するための方法を考えてみる。 ここで言う平均的に分類するというのは、分類された各グループのデータ数がほぼ等しく、かつ、分類された各グループの平均値が定量データ全体の平均値にほぼ等しくなるように分類するということである。 具体的には、学生のクラス替えを行う際に、100人の学生を3つのクラスに振り分けたいが、その場合、各ク […]
  • R ggplot2を用いた2軸グラフの簡単な作成方法R ggplot2を用いた2軸グラフの簡単な作成方法 Rのggplot2を用いて、2軸グラフを作成するための簡単な方法をお伝えします. 2軸グラフは、グラフの縦軸(y軸)が左側と右側の両方にあり、それぞれ単位が異なるグラフのことを言います。 2軸グラフは、一般的に推奨されてはおりません。 そのため、ggplot2パッケージを用いた2軸グラフを作成するためには、scale_y_continuous()関数のsec.axi […]
TensorFlow チュートリアルMNIST For Beginnersを試してみる

TensorFlow チュートリアルMNIST For Beginnersを試してみる」への2件のフィードバック

コメントは受け付けていません。