juedaiyuer MNISTマシン学習



MNISTは、さまざまな手書きデジタル画像を含むエントリーレベルのコンピュータビジュアルデータセットです.
1.MNISTデータセット
MNIST、ハイエンドの大気に聞こえるのではないでしょうか.これは何なのか分かりません.
==手書きデジタル分類問題で使用する(クラシック)MNISTデータセット==
MNISTデータセットの公式サイトはYann LeCun's website
このデータセットのpythonコードを自動的にダウンロードしてインストールします
このセグメントコードはtensorflow/examples/tutorials/mnist/input_data.py
"""Functions for downloading and reading MNIST data."""from __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_functionimport gzipimport osimport tempfileimport numpyfrom six.moves import urllibfrom six.moves import xrange  # pylint: disable=redefined-builtinimport tensorflow as tffrom tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets

プロジェクトのインポート
import tensorflow.examples.tutorials.mnist.input_dataimport input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

2.TensorFlowを実行するInteractiveSession
TensorFlowを使用する前に、まずインポートします.
import tensorflow as tfsess = tf.InteractiveSession()

3.計算図
Pythonで効率的な数値計算を行うために、通常はNumPyのようなライブラリを使用して、マトリクス乗算などの時間のかかる操作をPython環境の外部で計算します.これらの計算は通常、他の言語でより効率的なコードで実現されます.
しかし、残念なことに、各操作がPython環境に戻るには、大きなコストがかかります.GPUまたは分散環境で計算したい場合は、このオーバーヘッドがより恐ろしい場合があります.このオーバーヘッドは主にデータ移行に使用される可能性があります.
TensorFlowもPythonの外部で主な作業を完了したが,このようなオーバーヘッドを回避するために改善された.Pythonの外部で独立して時間のかかる操作を実行する方法ではなく、まずインタラクティブな操作図を説明し、Pythonの外部で完全に実行します.これはTheanoやTorchのやり方と似ています.
したがってPythonコードの目的は,外部で実行可能な計算図を構築し,計算図のどの部分が実行されるべきかを手配することである.詳細は、基本的な使い方の計算グラフのセクションを参照してください.
4.ソフトmax回帰モデルの実現
4.1プレースホルダ
入力画像xとターゲット出力カテゴリy_ノードを作成して計算図の構築を開始
これらのインタラクティブな操作ユニットは、シンボル変数を操作することによって記述され、以下の方法で作成できます.
x = tf.placeholder("float", shape=[None, 784])y_ = tf.placeholder("float", shape=[None, 10])

xは特定の値ではなく、TensorFlowで計算を実行するときにこの値を入力するプレースホルダplaceholderです.任意の数のMNIST画像を入力し,各図展で平成784次元のベクトルを入力することを望んでいる.これらの図を2次元の浮動小数点数テンソルで表し,このテンソルの形状は[None,784]である.(ここのNoneは、このテンソルの最初の次元が任意の長さであってもよいことを示す.)
出力カテゴリ値y_また、あるMNISTピクチャに対応するカテゴリを表すために、動作ごとに1つの10次元one−hotベクトルが使用される2次元テンソルでもある.
placeholderのshapeパラメータはオプションですが、TensorFlowはデータ次元の不一致によるエラーを自動的にキャプチャできます.
4.2変数
我々のモデルにも重み値とバイアス量が必要であり,もちろんそれらを別の入力(プレースホルダを使用する)と見なすことができるが,TensorFlowはそれらを表すより良い方法がある:Variable.1つのVariableは、TensorFlowのインタラクティビティ動作を記述するための図に存在する修正可能なテンソルを表す.入力値の計算に使用したり、計算で変更したりできます.各種の機械学習応用については,一般にモデルパラメータがあり,Variableで表すことができる.
W = tf.Variable(tf.zeros([784,10]))b = tf.Variable(tf.zeros([10]))

tf.Variableを呼び出したときに初期値を入力します.この例では,Wとbの両方をゼロベクトルに初期化した.Wは784 x 10の行列である(我々は784の特徴と10の出力値を持っているからである).bは10次元のベクトルです(分類が10あるので)
変数はseesionで初期化してからsessionで使用する必要があります.この初期化ステップは、初期値に具体的な値(この例ではすべてゼロ)を指定し、各変数に割り当て、すべての変数に対して一度にこの操作を完了することができます.
sess.run(tf.initialize_all_variables())

5.カテゴリ予測
モデルを実現することができます1行のコードしか必要ありません!各分類のsoftmax確率値の計算
y = tf.nn.softmax(tf.matmul(x,W) + b)

tf.matmul(X,W)はxにWを乗じたものを表し、前の式の中のWxに対応し、ここでxは2次元テンソルが複数の入力を持つ.そしてbを加えて、tf.nn.softmax関数に入力します.
私たちのモデルを訓練するために、私たちはまずこのモデルを評価するために指標を定義する必要があります.実際,機械学習では,モデルが不良であることを示す指標を通常定義し,この指標をコスト(cost)または損失(loss)と呼び,その後,この指標をできるだけ最小化する.しかし、この2つの方法は同じです.
非常に一般的な、非常にきれいなコスト関数は「クロスエントロピー」(cross-entropy)です.クロスエントロピーは情報論における情報圧縮符号化技術に生じるが,ゲーム論から機械学習など他の分野における重要な技術手段に進化した.定義は次のとおりです.
クロスエントロピーは,真実を記述するための我々の予測の低効率性を測定するために用いられる.
  • クロスエントロピー
  • 式に基づいてクロスエントロピーを計算すると,訓練過程に誤差を最小化するための損失関数を容易に指定でき,我々の損失関数はターゲットカテゴリと予測カテゴリ間のクロスエントロピーである.
    cross_entropy = -tf.reduce_sum(y_*tf.log(y))

    まず,yの各要素の対数をtf.logで計算する.次にy_をの各要素とtf.log(y)の対応する要素を乗算します.最後に、tf.reduce_でsumはテンソルのすべての要素の合計を計算します.(なお、ここでのクロスエントロピーは、単一の一対の予測と真実値を測定するために用いられるだけでなく、すべての100枚のピクチャのクロスエントロピーの総和である.100個のデータ点に対する予測表現は、単一のデータ点の表現よりも我々のモデルの性能をよりよく記述することができる
    6.トレーニングモデル
    私たちのモデルが何をする必要があるかを知っています.TensorFlowで訓練するのは簡単です.TensorFlowはあなたの各計算ユニットを説明する図を持っているので、逆伝播アルゴリズム(backpropagation algorithm)を自動的に使用することができます.変数が最小化したいコスト値にどのように影響するかを効果的に決定します.その後、TensorFlowは選択した最適化アルゴリズムで変数を絶えず修正してコストを削減します.
    train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

    ここではTensorFlowが0.01の学習速度で交差エントロピーを最小化する勾配降下アルゴリズム(gradient descent algorithm)を用いることを要求する.勾配降下アルゴリズム(gradient descent algorithm)単純な学習プロセスであり、TensorFlowは各変数を少しずつコストを削減する方向に移動するだけです.もちろんTensorFlowは他の多くの最適化アルゴリズムを提供しています.1行のコードを簡単に調整すれば他のアルゴリズムを使用することができます.
    TensorFlowはここで実際にやっているのは、バックグラウンドであなたの計算を説明する図に一連の新しい計算操作ユニットを追加して、逆伝搬アルゴリズムと勾配降下アルゴリズムを実現することです.そして、それはあなたに返されたのは単一の操作で、この操作を実行すると、勾配降下アルゴリズムであなたのモデルを訓練し、あなたの変数を微調整し、絶えず減少します.コストを少なくする.
    それからモデルの訓練を始めます.ここではモデルを1000回繰り返し訓練します.
    for i in range(1000):
      batch_xs, batch_ys = mnist.train.next_batch(50)
      sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

    別のコードの書き方
    for i in range(1000):
      batch = mnist.train.next_batch(50)
      train_step.run(feed_dict={x: batch[0], y_: batch[1]})

    このループの各ステップでは、トレーニングデータの50バッチのデータポイントをランダムにキャプチャし、これらのデータポイントをパラメータとして置換する前のプレースホルダとしてtrain_stepを実行します.
    一部のランダムデータを用いて訓練を行うことをランダム訓練(stochastic training)と呼ぶ-ここでより正確にはランダム勾配降下訓練です.理想的には、各ステップの訓練をすべてのデータで行いたいと考えています.これは、より良い訓練結果をもたらすことができますが、計算コストが大幅にかかることは明らかです.したがって、訓練ごとに異なるデータのサブセットを使用することで、計算コストを削減し、最もコストを削減することができます.データセットの全体的な特性を大きく学習します.
    7.モデルの評価
    まず、予測が正しいラベルを見つけましょう.tf.argmaxは、tensorオブジェクトのデータの最大値があるインデックス値を与える非常に有用な関数です.ラベルベクトルは0,1で構成されているため、最大値1があるインデックス位置は、tf.argmax(y,1)などのカテゴリラベルです.各予測数字の中で最も確率の高いものであり、tf.argmax(y_,1)は正しいラベルを表し、tf.equalを使用して予測が実際のラベルマッチング(インデックス位置のようにマッチングを表す)かどうかを検出することができます.
    correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

    この行のコードはブール値のセットを与えます.正確な予測項目の割合を決定するために、ブール値を浮動小数点数に変換して平均値をとることができます.たとえば、[True,False,True,True]は[1,0,1,1]になり、平均値をとると0.75になります.
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

    最後に,学習したモデルのテストデータセット上の正解率を計算した.
    print sess.run(accuracy, feed_dict={x: mnist.test.p_w_picpaths, y_: mnist.test.labels})#    0.9092

    8.コード
    from tensorflow.examples.tutorials.mnist import input_data
    mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)print(mnist.train.p_w_picpaths.shape, mnist.train.labels.shape)print(mnist.test.p_w_picpaths.shape, mnist.test.labels.shape)print(mnist.validation.p_w_picpaths.shape, mnist.validation.labels.shape)import tensorflow as tf
    sess = tf.InteractiveSession()
    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.float32, [None, 10])
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
    
    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
    
    tf.global_variables_initializer().run()
    
    for i in range(1000):
        batch_xs, batch_ys = mnist.train.next_batch(100)
        train_step.run({x: batch_xs, y_: batch_ys})
    
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
    
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))print(accuracy.eval({x: mnist.test.p_w_picpaths, y_: mnist.test.labels}))