頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


機械学習におけるデータの範囲(2)

機械学習におけるデータの範囲
↑の続き。データの範囲はどうしても0から1じゃないとダメなのか問題。オチもよくわからないってことなんだがやったこと書いとく。

簡単化するためMNISTで同じようなことをやって確認してみた。ちなみに畳み込みのある方のMNIST。
これも自分でtfrecord形式のデータを作成してて、読み込む時は画像データ(輝度)の値を
tf.uint8
で得ている。8ビットの符号なし整数だから0から255。
image = tf.cast(image, tf.float32)
image /= 255.0
という感じでfloatにキャストしといてから255で割って、0から1.0になるようにしてる。当然これはちゃんと学習が進む。

輝度の確認

↑元画像はこんなので明るい部分はをチェックすると0.99近い。
なのでさっきのを
image /= 128.0 # 255.0
って書き換えたら0から2.0くらいになる。
試しにこれでやってみると、、、ちゃんと学習が進んだ!
image /= 85.0
これだと0から3.0くらいなんだが、、、学習が進むことも落ちることもあった。
データファイルの順番、バッチ作成時にランダムになるようにしてるから毎回同じってわけでは決してないので、たまたまいけることもあればたまたまダメなこともあるってことで、そこはええねん。

落ちる時のエラーメッセージにはこんなのが。
Nan in summary histogram for: conv2/weights_0

これってTensorBoardで必要なデータを出力する時の話?と思ってその辺りを消して実行すると、落ちずに処理は進むんだけど、cross entropyがずっとNanのままだった。
損失関数が発散するような場合には学習率を変えればうまくいったことがあったが、今回は全然効果なし。

ちなみに
(1)image /= 255.0(0から1.0)の場合
(2)image /= 85.0(0から3.0)で処理ができた場合
それぞれでTensorBoardのDistibutionを比較するとweight,biasの分布はさほど変わらずだけど、初期の勾配が大きくなっている。

TensorBoardによる係数の分布1

↑こちらは(1)の方。

TensorBoardによる係数の分布2

↑こちらは(2)の方。

けどこの程度で問題になるんかな?
数学的には別に0から1じゃなくてもいけるんだけど、コンピュータの処理上でどこかでオーバーフローでもやってるんだろうか?

<< Depth APIで部屋の奥の方を消してみた  TopPage  カメラで得た画像にVision frameworkを使う >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1096-3b4d7951




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad