前回、Windows10+GTX1060でTensorflow実行環境の構築が簡単にできたにて、無事Tensorflowを動かすことができたので、今回はTensorFlowのチュートリアルをやってみます。
分かりやすそうなQiita記事があったので、これを読んで理解することをゴールとしてやってみる。
TensorFlowチュートリアル – ML初心者のためのMNIST(翻訳)
本家(翻訳前):https://www.tensorflow.org/versions/master/get_started/mnist/beginners
さっそくやってみる
MNIST は、単純なコンピュータビジョンのデータセットで、具体的にはラベルの付いた手書き文字データセットのことを言う。MNISTは「エムニスト」と読むらしい。
チュートリアルでは以下をやるようだ。
- 目的:手書きの数字画像を見た時にそれがどの数字なのかをモデルを用いて予測する
- モデルは、ソフトマックス回帰を利用
- モデルは、学習することで予測できるようにする(訓練する)
- 教師あり学習
- モデルの学習にはMNISTを用いる
このチュートリアルでは、mnist_softmax.py コードで起きていることを1行ずつ解説します。
とあるので、とりあえず前回作った環境でmnist_softmax.pyを実行できるか試してみる。
$ jupyter notebook
jupyterを起動してnotebookにmnist_softmax.pyをすべてコピペして実行。なんか最後に変なエラーが出たが、目的の処理はなされてそうなので放っておく。
Extracting /tmp/tensorflow/mnist/input_data\train-images-idx3-ubyte.gz Extracting /tmp/tensorflow/mnist/input_data\train-labels-idx1-ubyte.gz Extracting /tmp/tensorflow/mnist/input_data\t10k-images-idx3-ubyte.gz Extracting /tmp/tensorflow/mnist/input_data\t10k-labels-idx1-ubyte.gz 0.9191 SystemExit C:\Program Files\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:2889: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
動いたので読み進めると、チュートリアル内での達成目標は以下とある。わかりやすい。
- MNIST データとソフトマックス回帰について学ぶ
- 画像内の全ピクセルを調べることによる、数字を認識するためのモデルである関数を作成する
- TensorFlow を使用して、数千の例を「見て」数字を認識させるようにモデルを訓練する(そのために初めての TensorFlow セッションを実行する)
- テストデータでモデルの精度をチェックする
MNISTデータとは?
ニューヨーク大学教授とGoogleラボの方が提供しているデータセット
Yann LeCun, Professor
The Courant Institute of Mathematical Sciences
New York UniversityCorinna Cortes, Research Scientist
Google Labs, New York
corinna at google dot com
MNISTデータは3つの部分から成る。
- 訓練データ(mnist.train)- 55,000データポイント
- テストデータ(mnist.test)- 10,000データポイント
- 検証データ(mnist.valid)- 5,000データポイント
クロスバリデーションとか考えずにとりあえず分割された教師データ(訓練データ)や検証データがあるのか。。。テストデータってなんだ?訓練データとなにが違う?
データとデータポイントという用語はどうして使い分けている?
【とりあえず読み進める】
MNISTデータポイントは「画像」と「対応するラベル」から成る。ここで
- 画像を「x」
- ラベルを「y」
と定義。
訓練データセットとテストデータセットはどちらもx,yを持つ。
実行した際に取得したディレクトリ内にある以下のファイルはそれぞれ次の意味を持つ?
- t10k-images-idx3-ubyte.gz おそらく検証データの画像
- t10k-labels-idx1-ubyte.gz おそらく検証データのラベル
- train-images-idx3-ubyte.gz 学習データの画像
- train-labels-idx1-ubyte.gz 学習データのラベル
画像は、28×28ピクセルから成り、28×28=784 の数値のベクトルである。このベクトルをフラットにして配列として扱うらしい。配列にいれて大丈夫なのかと思うだろうが、非常にリッチな構造をもった784次元のベクトル空間の一連の点とみなせるので大丈夫ならしい。
より高度なコンピュータビジョンの方法では、2次元構造を活用するが、今回のチュートリアルで利用するソフトマックス回帰では、「データをフラットにすること」=「2次元構造の情報をすてること」はそう悪くないらしい。
以下のリンクを張っていただいていたので、おそらく読めば何か書いてあるのかも?(英語だから読まない)
Visualizing MNIST: An Exploration of Dimensionality Reduction – Posted on October 9, 2014
結局扱うデータは以下のテンソル(n次元配列)や配列になる。
■画像データセット: [55000, 784] のテンソル
各テンソルの要素は、0 と 1 の間のピクセル強度(グレースケール)
■ラベルデータセット:[55000, 10] の配列
例えば、ラベルを3 つ目の要素は、[0,0,0,1,0,0,0,0,0,0]の配列。(float型らしい。。。なぜ?)
ソフトマックス回帰とは?
ソフトマックス回帰(Soft Max Regression : 数式で確認したいならこちら)
少し調べた結果、誤解を恐れずに言い切ると以下でよさそうだ。
ソフトマックス回帰とは、ニューラルネットワークの活性化関数にソフトマックス関数を利用してパターン識別する(予測確率を計算する)モデルのこと
最終的には y=softmax(Wx+b) で表現される
詳しくは、参考元を読んでくださいー
回帰の実装
以下のようにtensorflowではplaceholderが利用される。以下のように記述すると、xは特定の値でなく、xは32bit浮動小数の任意の形状[None, 784]であることを意味するっぽい。(Noneは次元が任意の長さをとることを示す)
x = tf.placeholder(tf.float32, [None, 784])
同様に、重みWとバイアスbを以下のように記述することでモデルを作成することができる
W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) y = tf.matmul(x, W) + b
matmulは、おそらくmatrixのmultipleで、高次元同士の積を意味すると思う。
【疲れたので続きは今度】
参考サイト
参考にさせていただいたサイト
- TensorFlowチュートリアル – ML初心者のためのMNIST(翻訳)
- このページで読ませていただいた記事
- MNIST 手書き数字データを画像ファイルに変換する
- MNISTデータの中身に関して詳しく書いていて理解が捗ります
- 活性化関数のまとめ
- ソフトマックス関数は活性化関数の一つであることがわかる
- TensorFlowチュートリアル – ML初心者のためのMNIST(翻訳)
コメント