TensorFlowハンズオン(5) 画像に書かれた数字を判定する(学習用の関数をつくる)

やっと学習させるところまで来ました(੭ु ´・ω・)੭ु⁾⁾

復習

ここまでやりました(`・ω・´)

yとy_とをくらべるのでしたが、yは確率ではなくて、そのままではy_とくらべることができません。

そのために今回はいろいろやってくれる関数をつかいます╭( ・ㅂ・)و ̑̑ グッ

ソフトマックス

あまり聞きなれない感じの言葉ですが・・・

確率でないベクトルを、確率のベクトルにするのにつかいます(`・ω・´)

確率のベクトルは、

  • それぞれの値が0~1の間で
  • ぜんぶ足すと1になる

という条件を満たします。

floatなので誤差が出てますが、ちゃんと1になってますね!!

これは以下のような計算で出しています(`・ω・´)

クロスエントロピー

おっとなんか難しそうなのが出てきました(੭ु ´・ω・)੭ु⁾⁾

とはいえこれはざっくり言うと、各学習データの正答率をぜんぶかけ合わせたもの(を計算しやすいようにlogしてマイナスをつけたもの)です。

正答率をぜんぶかけ合わせたものは0~1の間になるので、logしてマイナスをつけると+∞~0の間になります。

これがクロスエントロピーです (੭ु ´・ω・)੭ु⁾⁾

理想的なとき

ぜんぶの学習データに対して「100%の確率で正解です!」と言えるのが、理想のニューラルネットワークですね!

この場合は、正答率をぜんぶかけ合わせると1になります。-log(1) = 0なので、クロスエントロピーは0です(๑・ᴗ・´๑)

最悪なとき

逆に、どれかひとつでも、たとえば本当は7なのに「0%の確率で7です!」と言ってしまう・・・つまり、ある学習データに対して「0%の確率で正解です!」と言ってしまうニューラルネットワークがあった場合・・・

この場合は、正答率をぜんぶかけ合わせると0になります。-log(0) = +∞なので、クロスエントロピーは+∞です(੭ु ´・ω・)੭ु⁾⁾

かしこいニューラルネットワークの条件

つまりクロスエントロピーが小さくて0に近いほど、正答率が平均的に高くて、かしこいニューラルネットワークであると言えます(๑・ᴗ・´๑)

クロスエントロピーとソフトマックスを一緒につかう

tf.nn.softmax_cross_entropy_with_logitsという関数を使います(`・ω・´)

logit(ロジット)とはソフトマックスする前のもの(いまの場合はy)のことです╭( ・ㅂ・)و ̑̑ グッ

labelには正解データ(いまの場合はy_)を入れます。

yとy_はベクトルではなく行列なので、tf.nn.softmax_cross_entropy_with_logitsだけだと、それぞれの学習データ(行)に対してクロスエントロピーを出してしまいます(´・ω・`)

つまり1問ずつの正解率になってしまうので・・・

これを足し合わせるためにtf.reduce_meanという関数を使います(確率のかけ算は、クロスエントロピーではlogをとるのでたし算になります)。

次は

学習データを使って、重みWやバイアスbを調節しながら、クロスエントロピーの式をできるだけ0に近づけることが目標ですね╭( ・ㅂ・)و ̑̑ グッ

これを次にやります(`・ω・´)

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

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

フォローする