TensorFlowハンズオン(4) 画像に書かれた数字を判定する(グラフを作る)

やっと機械学習はいります(`・ω・´)

学習データの読み込み

MNIST(エムニスト)という学習データを読み込みます(੭ु ´・ω・)੭ु⁾⁾

こういう感じのデータの詰め合わせで、機械学習の分野ではよく使われる定番の学習データです。いわゆるHello, World!的な存在ですね(`・ω・´)

TensorFlowではとても簡単にこのデータを使えるようになってます。

データをダウンロードしてくるので、一時フォルダに保存しておきましょう╭( ・ㅂ・)و ̑̑ グッ

mnistの中身はこんな感じになってます。trainとvalidationが学習用、testがテスト用です。

imagesとlabelsにデータが入っています。mnist.trainで見てみます(`・ω・´)

testの場合、imagesは55000枚×784ピクセルの画像情報、labelsは55000枚×10個の数字についての正解率の情報が入っている行列です(`・ω・´)

imagesは、画像1枚の全ピクセル情報が1行に入っています。labelsは、画像1枚の各数字の正解率が1行に入っています。行列のかけ算をするときに大切なので注意しておきましょう╭( ・ㅂ・)و ̑̑ グッ

グラフを作る

784ピクセルの色の濃さから、10個の数字のどれかを見たいので、こんな感じのニューラルネットワークを組みたいと思います(`・ω・´)

このニューラルネットワークは、「このピクセルが黒かったら、きっとこれは5の可能性がけっこう高いし、3の可能性もわりとある、逆に1とか2とかには無関係で、7の可能性はむしろ低い」といった判断をします。

これが重みと呼ばれているもので、今回学習させるのはこの「重み」です(੭ु ´・ω・)੭ु⁾⁾

xには学習データmnist.train.imagesが入ります(shapeは(55000, 784))。

placeholderのshapeにNoneを入れると、計算するときにデータの大きさに応じて大きさが決まります。なので、計算時にmnist.train.imagesを入れると、xは55000行784列の行列となります(`・ω・´)

Wはピクセルの重みをあらわす784行10列の行列です。ニューラルネットワークの図の直線に対応していて、そのピクセルが黒いことによって、どの数字の可能性があって、どの数字の可能性がないのか、をあらわします。

ここが学習の対象となる場所です。初期値は784行10列のゼロ行列です(`・ω・´)

bはバイアスと呼ばれる10要素のベクトルです。ここも学習の対象となる場所です。初期値は10要素のゼロベクトルです(`・ω・´)

これは要するに真っ白な紙をどの数字として判断するのか?という指標でもあります。だいたい全数字が均等な値になることが予想できますね(੭ु ´・ω・)੭ु⁾⁾

yは55000行10列の行列で、ピクセルごとの重みとバイアスを数字ごとに全部足し合わせたものです。学習結果をmnist.train.labelsと照らし合わせて答え合わせをします。

bを足すときにbroadcastルールを使っているのでわかりにくいですが・・・

xとWをかけると、55000行10列の行列となります。これにベクトルbを足そうとすると、broadcastルールにより、10要素のベクトルbは、それを55000行だけ縦に繰り返した55000行10列の行列に変換されます。なのでこの式はエラーにはなりません╭( ・ㅂ・)و ̑̑ グッ

(ちなみにyの各行はマイナスだったり、全部足しても1にならなかったりするので、実は確率ではなくて、そのままではmnist.train.labelsと比べることができません。できないのですが、それでも内部でいろいろやってくれる関数があるので、それを呼び出せばOKです。これは次回で説明します)

こちらは答え合わせ用のplaceholderで、mnist.train.labelsが入ります。

計算時にmnist.train.labelsを入れると、y_は55000行784列の行列となりますね(`・ω・´)

次は

yとy_をつかって、Wとbを学習させていきます・・・

おたのしみの学習いきます!!╭( ・ㅂ・)و ̑̑ グッ

プロフィールかけぼ(ckbx_cakebox)

うたったりおどったりしよります(๑`・ᴗ・´๑)
音楽系サービスFrekulのエンジニアでもあります(。・ω・) 最近はラバノーテーション(ダンスの楽譜)にはまってます٩( ‘ω’ )و
踊ってみた動画はこちら → http://nico.ms/sm31776982

フォローする