So-net無料ブログ作成

TensorFlow MNIST For ML Beginners をやってみた(2) [Deep Learning]

TensorFlow MNIST For ML Beginners をやってみると使い方はわかりますが、理屈がわからないと気持ち悪いですよね。少し TensorFlow から話ははずれますが、Deep Learning の理屈について考えてみます。

ポイントは、損失関数と学習の仕組みです。損失関数を最小にするように学習するというのが Deep Learning の理屈ですが、これは蓋を開けてみると、最小二乗法で近似曲線を割り出す理屈と同じだったりします。


こちらのページが最も分かりやすかったです。

解けない連立方程式とディープラーニング
http://www.fward.net/archives/2126


ここで、上のサイトでサンプルに出ている行列を考えてみます。これは MNIST のミニチュア版といえます。


A.png


ここで、重みデータであるWを変数、損失関数を二乗誤差とすると二次曲線で表せます。このWの値を曲線の傾きに学習係数ηを掛けた分だけずらしていき、損失関数が最小になる曲率ゼロまで近づけていきます。


B.png


この学習係数ηは、結構くせもので図を見てもわかるように、小さすぎると学習ステップを多くしなければならないですし、大きすぎると曲率ゼロ付近で振動をしてしまいます。

さて理屈は分かったのですが、せっかくなのでプログラムを作って検証したいところです。そこで損失関数の微分値の式を導出してみましょう。行列の微分なのでちょっとやっかいです。

最初に損失関数を展開します。絶対値なので、転置行列と行列の積になることに注意します。


C.png


さて、微分をしてみましょう。行列の微分には公式があります。こちらのサイトがよくまとまっています。


D.png


ということで損失関数の微分は、Xの転置行列に教師データと計算値の誤差を掛けたものになりました。


E.png


それにηをかけてWの値を更新します。


F.png


これを python のプログラムにしてみました。η は 0.0229 と設定しています。

import numpy as np
import math

X = np.array([[1,1], [3,1], [5,1], [7,1]], dtype="float").reshape((4, 2))
w = np.array([1, 1], dtype="float").reshape((2,1))
t = np.array([1, 4, 4, 8], dtype="float").reshape((4,1))

L = np.dot(X,w) - t  # X*w - t
Loss = (sum(np.power(L,2))/2).round(8)  # ||X*W - t||^2 / 2
preLoss = Loss
print(Loss)

eta = 0.0229
for i in range(5000):
   dL = np.dot(X.T,(np.dot(X,w) - t))  # XT*{XW - t}
   w = w - np.dot(eta,dL)  # W = W - eta*dL/dw
   L = np.dot(X,w) - t
   Loss = (sum(np.power(L,2))/2).round(8)
   if preLoss <= Loss:
       break;
   preLoss = Loss
   print(Loss)

print(i)
print(Loss)
print(w)



これを実行すると以下のようになります。

1174
[ 1.35000079]
[[ 1.04986813]
 [ 0.0499746 ]]


1174回目で損失関数が最小になり、値は1.35。Wa は 1.05、Wb は 0.05 になりました。解説サイトの数値とあっていますね。

これで、学習の実態はわかりました。損失関数や学習ステップ、学習係数が把握できたところで次のステップに進みますか。あーすっきりした。
(*^_^*)





ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)



ディープラーニングがわかる数学入門

ディープラーニングがわかる数学入門

  • 作者: 涌井 良幸
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/03/28
  • メディア: 単行本(ソフトカバー)



TensorFlowはじめました 実践!最新Googleマシンラーニング (NextPublishing)

TensorFlowはじめました 実践!最新Googleマシンラーニング (NextPublishing)

  • 出版社/メーカー: インプレスR&D
  • 発売日: 2016/07/29
  • メディア: Kindle版




nice!(33)  コメント(2) 
共通テーマ:趣味・カルチャー

行列演算に苦しむ…(´・ω・`) [徒然日記]

Deep Learning をやっていると行列演算がたくさん出てきます。逆行列の計算くらいは覚えているのですが、行列の演算定理をすっかり忘れている。それに加えて偏微分。学生時代の記憶が遠すぎて手繰り寄せられない…


さらにはまる.png


加えて Python がまたやっかい。行列演算が楽なのはよくわかったのですが、単純な for 文をやろうとしても文法がちょっと特殊なので、いちいち調べないといけない。めんどい。


dude_come_on.png


しばらく、学生気分に戻って行列と Python を勉強しないといけないなぁ。はぁ…。
(´・ω・`)





ディープラーニングがわかる数学入門

ディープラーニングがわかる数学入門

  • 作者: 涌井 良幸
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/03/28
  • メディア: 単行本(ソフトカバー)



ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)



図解入門よくわかる行列・ベクトルの基本と仕組み (How‐nual Visual Guide Book)

図解入門よくわかる行列・ベクトルの基本と仕組み (How‐nual Visual Guide Book)

  • 作者: 苅田 正雄
  • 出版社/メーカー: 秀和システム
  • 発売日: 2004/04/09
  • メディア: 単行本




nice!(29)  コメント(4) 
共通テーマ:趣味・カルチャー

UFO撮影しちゃったかも!?(@_@;) [ちょっと気になるトンデモ学説!]

カミさんと娘が横浜に出かけている最中に、雷鳴のない雷を発見。気持ち悪いねーとスマホで写していたら、なんとUFOらしき発光体を撮影しちゃったみたいです!いやー、ほんとにこんなことあるんですねぇ。





肉眼で見ると何も見えなかったようですが、スマホを通してみると見えたようです。ということは近赤外線で発光していたということですね。

雷と関係しているように見えないのでプラズマではないですねぇ。スマホの動きに連動しているようにも見えますが、ピンぼけすると発光体もピンぼけするのでゴミとかではなさそうです。

昆虫とかだったら、肉眼で分かりそうだし。この動きに最も近いのは、何かの照準ですね。厚木基地で何かやってたのかな。うーん、さっぱりわからん。
(。-`ω´-)








タグ:UFO 発光体
nice!(31)  コメント(5) 
共通テーマ:趣味・カルチャー

草食恐竜が甲殻類も食べていた!?巨大恐竜は水棲生物? [ちょっと気になるトンデモ学説!]

草食恐竜が実は甲殻類も食べていたという研究結果が報告されたようです。


草食恐竜、実は甲殻類も食す 米ユタ州のふんの化石から判明
http://www.afpbb.com/articles/-/3143848


ふんの持ち主は不明なのですが、かものはしの様な口ばしを持つハドロサウルスではないかと考えられています。


Hadrosaurs.jpg


このニュースを見て、子供のころから漠然と思い描いていた考えが甦ってきました。それが何かというと、ブラキオサウルスなどの超巨大恐竜は実は水の中に生息していたのではないかということ。例えばこんな感じに。


Brachiosaurus.jpg


理由は、もちろん巨大な体を地上で支えられる訳がないんじゃないの?ということに加え、鼻の位置です。大型恐竜はおしなべて鼻の位置が上にあります。あとは足の形です。足の形が象やカバに似てますよね。


brachinose.jpg


当時の気温は今よりもはるかに暖かかったといわれています。恐らく氷河や極氷がなかったでしょう。今よりも遥かに高い位置に水面があったと思われます。すなわち平原はほとんど湿地帯だったと思います。


湿地帯.jpg


大型恐竜が生息できる大きな平地はほとんどなく、湿地帯でカバのように生息していたのではないでしょうか?こんな学説は聞いたこともないので、眉唾ではあるとは思いますけど、ちょっと面白くありませんか?
(^ω^)







nice!(36)  コメント(3) 
共通テーマ:趣味・カルチャー

やる気スイッチが入らない…(´・ω・`) [徒然日記]

最近、仕事が忙しいのもあるのですが、この夏の忙しさの反動のせいか、早めに家に帰っても前ほど趣味の電子工作やらプログラミングに食指が動かない。


no_motivation.gif


ブログを振り返ってみると、OV7670やドローンが中途半端な状態で終わっている。うーむ、気持ちが悪い。とはいうものの始めたばかりのディープラーニングも中途半端に終わらせたくないし。


yaruki_switch.png


早くやる気スイッチ直ってくれー!
(´・ω・`)










nice!(33)  コメント(3) 
共通テーマ:趣味・カルチャー

グローバル化と勤務時間短縮の矛盾(4コマ漫画)(´・ω・`) [4コマ漫画]

最近の流行に乗り、うちの会社でも勤務時間短縮の運動が盛んになってます。個人的には短い時間で成果を出すという姿勢は大賛成です。職場に長居してると碌なことないしね。

とは言うものの、仕事がグローバル化してくるとそういう訳にもいかず。。。


workefficency.png


米国との打ち合わせは早朝。ヨーロッパとの打ち合わせは夕刻から。会議はなるべく会社で、となっているので、どうしても会社にいる時間が長くなってしまいます。

うーん、次は政府には在宅勤務を推奨してほしいなぁ。外資だと家から会議参加なんて当たり前なんだけど。
(´・ω・`)








nice!(35)  コメント(3) 
共通テーマ:趣味・カルチャー

さよならカッシーニ 。・゚・(ノД`)・゚・。 [徒然日記]

ついにカッシーニが土星の一部となってしまいました。今まで驚くべき発見の数々、そして素晴らしい土星の画像をありがとう。こちらのNASAの動画をぜひ見てみてください。何度見ても感動します。


cassini last.png


NASAのライブを見ていたのですが、プロジェクトが始まってから30年。多くのプロジェクトメンバーは60近くもしくはそれ以上の人たちばかり。研究者としてのキャリアを全てカッシーニに捧げてきた人たちです。


36403122434_0dcbf4fa70_z.jpg


今日の日は、決して忘れることができないでしょう。

カッシーニの最後の軌道です。ちょうど土星の赤道あたりに突っ込んだようです。


cassini last moment.png


こちらが通信が途切れるまでの軌跡です。かなり速いスピードで濃い土星の大気に突っ込んだので、2分くらいで燃え尽きたようです。


cassini last moment 2.png


もう少し詳しい図がありました。研究者としては、Well-mixed atmosphere まで届いて欲しかったでしょうね。


cassini last moment 3.png


カッシーニは最後の最後までアンテナを地球に向けてデータを送信をし続けていたようです。「はやぶさ」もそうでしたが、なんだか健気で感動的ですよね。


cassini last3.png


NASAが今回のミッション完遂の記念に、カッシーニの偉業をまとめた eBook を配布しています。綺麗な写真と簡潔な説明で眺めているだけでも楽しめます。

https://www.nasa.gov/connect/ebooks/the-saturn-system.html


残念ながら、次の土星探査の計画は未定のようです。息子の世代ではタイタンやエンケラドス、さらには、もっと遠方の天王星や海王星にも探査機を送ってくれないかな~。
((o(´∀`)o))








nice!(37)  コメント(6) 
共通テーマ:趣味・カルチャー

「カエルの楽園」を読んでみた! [徒然日記]

娘と息子から、面白いよと勧められて読んでみたのが、こちらの本。今話題になっているようですね。知りませんでした。


DSC04823.jpg


この物語は、難民となって放浪していたアマガエルのソクラテスが、命からがらたどり着いた国「ナパージュ」での騒動を、彼の視点で描いたものです。


「ナパージュ」のカエルは皆、平和的で規律正しくよそ者にも優しく接してくれる楽園でした。

ただ、この国は少しだけ奇妙な点がありました。一つは「三戒」という奇妙な決まりを持っていること。「カエルを信じろ」、「カエルと争うな」、「争うための力をもつな」というもの。カエルがカエルを喰らう所を幾多も見てきたソクラテスには到底理解できない決まりでした。

もう一つは、この国のカエルは喜々として「謝りソング」を歌うこと。”自分たちは生まれながらに積み深く、すべての罪は自分たちにある”という内容。なのに、なぜか皆うれしそうに歌っている。

さらに奇妙なのは、この国のカエルは、「三戒」があることで平和が守られていると信じきっていること。カエルがカエルを殺す、ワシや蛇に一方的に喰われるのがカエルの現実だと知っているソクラテスは、なぜこの国が平和なのか理解に苦しみます。


しかし、ソクラテスはその平和は、この国の高みに巣を持つワシのおかげで保たれていると気がつきます。決して「三戒」によって平和が守られているわけではないと。

そんなある日、下の沼地から天敵ともいえるヒキガエルが、ナパージュの領地に踏み込んでくる事件が発生しました。ナパージュの国は「三戒」をめぐり国民を二分する議論に発展。国は次第に混乱していきます。。。


続きは本を読んでくださいね。



まぁ、大体想像がつくとは思いますが、このおとぎ話はどこかの国がモチーフとなっています。本の内容はあまりにダイレクトで現実味があり、背筋が寒くなる思いです。

いろんな人たちに、この本の感想を聞いてみたくなりました。特に今のメディアの在り方に疑問を持っている人たちにお勧めの一冊です!
(^_^)/~






カエルの楽園 (新潮文庫)

カエルの楽園 (新潮文庫)

  • 作者: 百田 尚樹
  • 出版社/メーカー: 新潮社
  • 発売日: 2017/08/27
  • メディア: 文庫



「カエルの楽園」が地獄と化す日

「カエルの楽園」が地獄と化す日

  • 作者: 百田尚樹
  • 出版社/メーカー: 飛鳥新社
  • 発売日: 2016/11/11
  • メディア: 単行本(ソフトカバー)



言ってはいけない 残酷すぎる真実 (新潮新書)

言ってはいけない 残酷すぎる真実 (新潮新書)

  • 作者: 橘 玲
  • 出版社/メーカー: 新潮社
  • 発売日: 2016/04/15
  • メディア: 新書




nice!(41)  コメント(4) 
共通テーマ:趣味・カルチャー

ラズパイマガジン10月号に掲載されましたー(∩´∀`)∩ [Raspberry Pi]

夏休みに苦労して書いた記事が、ラズパイマガジン10月号に掲載されました!80ページの特集記事4です。書店で見かけたら、手に取って中身を見ていただけると、とっても嬉しいです。


DSC04822.jpg


会社のサークルメンバと分担をして書いたのですが、だいたい6割くらいのページを担当しました。一番苦労したのは車両の電気部分の組み立て。


DSC04829.jpg
DSC04825.jpg


カメラストリーミングとサーボ制御部分のソフトウェアはこちら。


DSC04826.jpg


ブラウザからコントロールできちゃいます。


DSC04828.jpg


なんと記事を書いている最中に、Raspberry Pi Zero W がリリースされ、システムを換装。


DSC04827.jpg


まぁ、良くがんばったなと。記事を書いている最中のぼやきはこちらを参照ください。

しかし、こうやって記事が形になるのは、ブログのアクセス数が伸びるのとは違う喜びがありますね。でも、記事をもう一度振り返って読みたいとは思いませんが…
( ̄▽ ̄;)





ラズパイマガジン 2017年10月号 (日経BPパソコンベストムック)

ラズパイマガジン 2017年10月号 (日経BPパソコンベストムック)

  • 作者:
  • 出版社/メーカー: 日経BP社
  • 発売日: 2017/09/04
  • メディア: ムック



Raspberry Pi Zero - ラズベリー・パイ ゼロ

Raspberry Pi Zero - ラズベリー・パイ ゼロ

  • 出版社/メーカー: Raspberry Pi Foundation(Raspberry Pi財団)
  • メディア: Personal Computers



Raspberry Pi Zero W Starter Kit

Raspberry Pi Zero W Starter Kit

  • 出版社/メーカー: ケイエスワイ
  • メディア: エレクトロニクス




nice!(29)  コメント(3) 
共通テーマ:趣味・カルチャー

TensorFlow MNIST For ML Beginners をやってみた(1) [Deep Learning]

TensorFlow でいよいよ認識処理を試してみたいと思います。ニューラルネットワークの基本中の基本である手書き文字の認識が例題です。


MNIST For ML Beginners.png


MNIST とは、その手書き文字を学習させるためのデータセットのことです。(MLとは Machine Learning のことです)例えばこんなデータが訓練用に6万点、テスト用に1万点、用意されています。


MNIST data sample.png


MNISTのデータは Yann LeCun's website からダウンロードすることができます。ダウンロードしてくるファイルは4種類あります。

train-images-idx3-ubyte.gz
train-labels-idx1-ubyte.gz
t10k-images-idx3-ubyte.gz
t10k-labels-idx1-ubyte.gz

これらをダウンロードしたら、MNIST_data というディレクトリを作って格納しておきます。解凍は必要はありません。


Deep Learning用のテストプログラムを用意します。TensorFlow GitHub Site からもダウンロードできます。

# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================

"""A very simple MNIST classifier.
See extensive documentation at
https://www.tensorflow.org/get_started/mnist/beginners
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import sys
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

FLAGS = None


def main(_):
  # Import data
  mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)

  # Create the model
  x = tf.placeholder(tf.float32, [None, 784])
  W = tf.Variable(tf.zeros([784, 10]))
  b = tf.Variable(tf.zeros([10]))
  y = tf.matmul(x, W) + b

  # Define loss and optimizer
  y_ = tf.placeholder(tf.float32, [None, 10])

  # The raw formulation of cross-entropy,
  #
  #   tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(tf.nn.softmax(y)),
  #                                 reduction_indices=[1]))
  #
  # can be numerically unstable.
  #
  # So here we use tf.nn.softmax_cross_entropy_with_logits on the raw
  # outputs of 'y', and then average across the batch.
  cross_entropy = tf.reduce_mean(
      tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
  train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

  sess = tf.InteractiveSession()
  tf.global_variables_initializer().run()
  # Train
  for _ in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

  # Test trained model
  correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
  accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
  print(sess.run(accuracy, feed_dict={x: mnist.test.images,
                                      y_: mnist.test.labels}))

if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--data_dir', type=str, default='/tmp/tensorflow/mnist/input_data',
                      help='Directory for storing input data')
  FLAGS, unparsed = parser.parse_known_args()
  tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)


実際に動かしてみました。

C:\Users\Taro\Documents\TensorFlow>python mnist_softmax.py --data_dir MNIST_data
Extracting MNIST_data\train-images-idx3-ubyte.gz
Extracting MNIST_data\train-labels-idx1-ubyte.gz
Extracting MNIST_data\t10k-images-idx3-ubyte.gz
Extracting MNIST_data\t10k-labels-idx1-ubyte.gz
0.9206


素っ気ない結果ですね。何をしているかはソースコードを読み解くしかありません。大きな処理の流れは以下になります。

(1)MNISTデータを読み込み
(2)ニューラルネットワークの数式モデルを定義
(3)損失関数を設定
(4)学習データでネットワークを学習
(5)テストデータで結果を確認

という感じです。それぞれのコードを抜粋すると以下になります。


(1)MNISTデータの読み込み
mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)

最後の one_hot というのは、一つの正解だけが1でその他は0となるような設定のことです。


(2)ニューラルネットワークの数式モデルを定義
  x = tf.placeholder(tf.float32, [None, 784])
  W = tf.Variable(tf.zeros([784, 10]))
  b = tf.Variable(tf.zeros([10]))
  y = tf.matmul(x, W) + b

784 x 10 の配列が定義されていますが、これは、28pixel x 28pixel = 784 pixel の文字データ、0-9 の10個のデータを示しています。x は手書きデータの入力で、bはバイアス、yはその出力です。

yWxb.png


(3)損失関数を設定
cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))

このニューラルネットワークの判定には、softmax 関数というものを使います。

softmax.png

詳細の理屈は抜きにして、この場合、損失関数には cross_entropy という関数を使います。

crossentropy.png


(4)学習データでネットワークを学習
 for _ in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

ここで batch というものが出てきました。この場合は100個データの損失関数を算出してその平均を学習用の損失データとして扱うという処理方法の様です。学習のための計算量を減らすことができると考えておけばよさそうです。


(5)テストデータで結果を確認
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

argmax(y, 1) というのはy行列の中から最大値を一つだけ抽出するというものです。yの計算結果と、 softmax の計算結果 y_ があっているかどうかで判定し、その判定結果の平均値から検出率を算出しています。

例えば、判定結果が [True,True,True,False,True,True,True,False,True,True] だとすると、検出率は0.8ということになります。


なんとなく処理の内容は見えてきました。次はどうやって学習しているのか詳しく見ていきたいと思います。しかし、行列演算のオンパレードで難しいなぁ。
σ(ー_ ー;





TensorFlowはじめました 実践!最新Googleマシンラーニング (NextPublishing)

TensorFlowはじめました 実践!最新Googleマシンラーニング (NextPublishing)

  • 出版社/メーカー: インプレスR&D
  • 発売日: 2016/07/29
  • メディア: Kindle版



ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)



TensorFlow機械学習クックブック Pythonベースの活用レシピ60+ (impress top gear)

TensorFlow機械学習クックブック Pythonベースの活用レシピ60+ (impress top gear)

  • 作者: Nick McClure
  • 出版社/メーカー: インプレス
  • 発売日: 2017/08/14
  • メディア: 単行本(ソフトカバー)




nice!(32)  コメント(2) 
共通テーマ:趣味・カルチャー