###### tags: `Tensorflow` `学習記録` --- # Tensorflow Tutorialを試してみて by yuji38kwmt 2017/08/19 --- <!-- .slide: data-background="#383838" --> # 学んだこと ---- <!-- .slide: data-background="#383838" --> # 参考にしたサイト [MNIST For ML Beginners(公式)](https://www.tensorflow.org/get_started/mnist/beginners) [TensorFlowチュートリアル - ML初心者のためのMNIST(翻訳)](http://qiita.com/KojiOhki/items/ff6ae04d6cf02f1b6edf) ---- <!-- .slide: data-background="#383838" --> ## 学んだ用語など * MNIST:Mixed National Institute of Standards and Technology. 手書き数字画像データベース * 訓練データで学習(適切なパラメータを決定)し、テストデータでモデルの精度を確認する。 --- <!-- .slide: data-background="#383838" --> # ソースコードの解説 下記サイトのコードを実行した。 [Tensorflow Tutorial mnist_softmax.py](https://github.com/tensorflow/tensorflow/blob/r0.7/tensorflow/examples/tutorials/mnist/mnist_softmax.py) ※一部修正 ---- <!-- .slide: data-background="#383838" --> ## モデルの生成 ```python # xは特定の値ではない # 数値「784」: MNISデータ1個のサイズ(28px×28px=784) x = tf.placeholder(tf.float32, [None, 784]) # 重みをゼロで初期化 # 数値「10」:画像から判断する結果の数(数字0~9) W = tf.Variable(tf.zeros([784,10])) # バイアスをゼロで初期化 b = tf.Variable(tf.zeros([10])) # モデルの実装 y = tf.nn.softmax(tf.matmul(x, W) + b) ``` ---- <!-- .slide: data-background="#383838" --> ### モデルの生成の解説 * モデルの数式: $\boldsymbol{y}=\text{softmax}(\boldsymbol{Wx}+\boldsymbol{b})$ * $y[i]$: `[0.2, 0.7, 0, 0, 0, 0, 0, 0, 0, 0.1 ]`のような配列。画像から判定した数字の確率を表す。この場合、数字「1」の確率が0.7で最も高い。 * softmax関数の中身: $\text{softmax}(x)_i = \frac{\exp(x_i)}{\sum_j \exp(x_j)}$ ---- <!-- .slide: data-background="#383838" --> ## 誤差と最適化方法を決定 ```python # 交差エントロピー誤算を算出 y_ = tf.placeholder(tf.float32, [None, 10]) cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) # 最適化方法を定義。降下勾配法。 train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) ``` ---- <!-- .slide: data-background="#383838" --> ## 誤差と最適化方法の解説 * 交差エントロピー誤差の数式: $H_{y'}(y) = -\sum_i y'_i \log(y_i)$ * 降下勾配法を使って、交差エントロピー誤差を最小化するパラメータを探す。 * "0.01"は学習率。どれだけパラメータを更新するかを決める。 ---- <!-- .slide: data-background="#383838" --> ## 訓練(学習) ```python # セッションを定義して、パラメータを初期化する sess = tf.InteractiveSession() tf.global_variables_initializer().run() # 訓練ステップを 1000 回実行する # 訓練セットから 100 個のランダムなデータポイントの「バッチ」を取得する # 確率的訓練 for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) ``` * 訓練データ60,000個の中から、毎回ランダムに100個のデータ(バッチ)抽出して、それを最適化する。確率的訓練法。 ---- <!-- .slide: data-background="#383838" --> ## テストデータを使って精度を検証 ```python # テストデータを使って、精度を検証 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.images, y_: mnist.test.labels})) ``` ---- <!-- .slide: data-background="#383838" --> ## 誤差と精度のグラフを表示 精度の計算には訓練データを用いる。 ```python # 精度のモデルを定義 correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # 訓練開始 loss_list = [] #誤差のリスト accuracy_list = [] #精度のリスト for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) # 誤差と精度(訓練データ)を計算 loss_val, accuracy_val = sess.run([cross_entropy, accuracy], feed_dict={x: batch_xs, y_: batch_ys}) loss_list.append(loss_val) accuracy_list.append(accuracy_val) import matplotlib.pylab as plt # 誤差のグラフを表示 plt.plot(loss_list) plt.show() # 精度のグラフを表示 plt.plot(accuracy_list) plt.show() ``` ---- <!-- .slide: data-background="#383838" --> ### 誤差の推移 ![](https://i.imgur.com/JFbK2eL.png) ---- <!-- .slide: data-background="#383838" --> ### 精度(訓練データ使用)の推移 ![](https://i.imgur.com/qqGH2AE.png) * テストデータでの精度:0.9153 ---- <!-- .slide: data-background="#383838" --> ## Adams法で計算 >AdamOptimizerも確率的勾配降下法のひとつであるが、他の方法より新しい(2015年に発表) >特徴的なことは、収束が指数関数的ではないことである。 下記サイトより引用 [TensorFlowのOptimizerを比較する(ベジェ曲線編)](http://qiita.com/cnloni/items/ad7dcb7521b936d9fc18) ```python # 学習率を決める必要がない train_step = tf.train.AdamOptimizer().minimize(cross_entropy) ``` ---- <!-- .slide: data-background="#383838" --> ## Adams法の誤差の推移 ![](https://i.imgur.com/fe9Xn9W.png) ---- <!-- .slide: data-background="#383838" --> ## Adams法の精度の推移 ![](https://i.imgur.com/RuNNMaN.png) * テストデータでの精度:0.9118 ---- <!-- .slide: data-background="#383838" --> ## Adams法の評価 * 降下勾配法より、誤差がゆるやかに減衰している ---- <!-- .slide: data-background="#383838" --> ## 実行したソース Gistにアップしました。 [mnist_降下勾配法.py](https://gist.githubusercontent.com/yuji38kwmt/20194cc0b8b4415b5faeaa910fbb0dde/raw/5d14ee5f00b80532e3e53371257d79537eb512a0/mnist_%25E7%25A2%25BA%25E7%258E%2587%25E7%259A%2584%25E9%2599%258D%25E4%25B8%258B%25E5%258B%25BE%25E9%2585%258D%25E6%25B3%2595.py)
{"metaMigratedAt":"2023-06-14T14:09:15.176Z","metaMigratedFrom":"Content","title":"Tensorflow Tutorialを試してみて","breaks":true,"contributors":"[]"}
    2631 views