Translate

2016年9月9日金曜日

書籍「TensorFlowはじめました」を3章まで読んでみる

TensorFlowをインストールして、
TensorFlowのチュートリアルをとりあえずなんとか勉強したら、
本くらい読めるようになっているかな..ということで
TensorFlowの本を読んでみた。

読んでみた本は、これ。
注意:以降の記事内容は本を持っている前提で書いてます。持ってない人が読んでもちんぷんかんぷんに終わると思います。


正直、夏と冬に2回しか店を開かないトコで入手したかのような
表紙かつ薄さ..

実はインストールする前にこの本を買ったのだけど、
この本インストール手順すら書かれてない
いきなりチュートリアルが始まる体だし、

実行するコード全体を表示していないので、
サンプルコードのダウンロードページから落としてこないと
全部のコードを入手できない。

なんとかよめんたのは2章の終わりp45まで。
ここまでで1週間かかりました..

GPUなしマシンのCoreOS上で

docker run -it p 8888:8888 - 6006:6006 gcr.io/tensorflow/tensorflow

でJupyter(PythonのWeb UI開発環境)があがるのでポート8888を
ブラウザで開いて、1章は難なく読み切る。

ちなみに8月中旬ごろ上記コマンドで実行したTensorFlowは0.9版のほうだった。

ちなみにTensor Boardは、

docker exec -it <コンテナID> /bin/bash

して、

tensorboard --logdir=/notebooks/

してからポート6006をブラウザで開くと見ることができる。

この本、電子版は治ってるのかもしれないが、オプションのハイフンが1個だけになっているが、pythonコードの引数指定ではハイフンは2個必要だ。以降も同じ。

で、2章。CIFAR10データセットを使って画像分類するチュートリアル。

ホームディレクトリ/notebooksdataディレクトリを切り、ダウンロードしたファイルを置く。

data_batch_?.bin という形式のファイルだが、bmpやpng形式ではない。
そのためpythonプログラムを書いてpngに変換してみようというのが最初の部分。

そして、ホームディレクトリに、reader.pyconvert_cifar10_png.pyを本にある通りそのまま打ち込む。外部エディタで作る場合はUTF-8に変換しないとjupytoerに配置できない。

python convert_cifar10_png.py --file ./data/data_batch_1.bin

を実行すると、/notebooks/data/data_batch_1.bin-??-?.png というファイルが16個でてきた。開いてみると、猫や、自動車、商用車、馬など10種類のちいさな画像を分類していくというものらしい。
それをCNN(畳み込みニューラネットワーク)をTensorFlowで実装するというのが、この後の流れ。

model.pyも本に全コードがのっているので、写しとった(先頭の方にあるリンクからコードをダウンロードしたほうがてっとりばやい)。

本の解説からconv1conv2pool1pool2fc3fc4の6層からなるニューラルネットワークモデルであり、conv1conv2が畳み込み層、pool1pool2がプーリング層、fc3fc4が全結合層(Full-Connectedの略でfc)。

このファイルmodel.pyはネットワークモデルを実行する関数inferrence()が定義されているだけなので、これを呼び出して、Cifar10データセットを食らわせるinferrence.pyを作る必要がある。

ホームディレクトリ上から

scrppt inferrence.py && python inferrence.py && exit

を実行すると、正解ラベルと予測確率配列(分類0である確率、分類1である確率..分類9である確率)が1行毎に表示される。

ただこの段階だと、一切学習していないので、正解も何も、賽の目降ったほうが合ってるんじゃってくらいにひどい..

この本では、それを実際に学習させ、そのあと実行したら正答率がこれだけになりましたよってシナリオになっている。

学習用の計算モデルとTensorflowセッション実行するファイルがtrain.py。

同様にして実行してじりじり正解していく様子を確認する。

pythonコマンドで実行したら、プロセスの終わりにヒープが消えすっかり馬鹿になるが、そのあたりは3章でわかってくるようになっている。
正解と予測確率配列がずらずらでるだけだとわかりずらいので、関数eval()を作成し、正答率がでるようにtrain.pyを改良、できあがったものがtrain_with_eval.py

本では、結構学習できてるように書かれていたが、私の結果はこうなった。



..0.1って10種類だからランダムで選んだのと同じじゃん..

ただ、コードをいじらず2度めやってみたらもっといい正答率をだすようになった。このあたりの曖昧さが、 機械学習のマネタイズしにくいところだ..


で、2章はここまで。ここまでのPythonコードに、1行1行コメントを入れて、実際に何をやっているかを勉強しなおし、復習。で、よむと結構考えられて設計されているのよ。ただ後続の章を読まないと理解できない。変数空間をなぜ切っているのかとかは3章にいかないとわからない。なのでなんでまわりくどいことを..とおもうところはそのままにしてコードを読んだほうが良い。


ここまでは、実行したら消えていた。3章でデータ保存についてとフィルタ(weights)の可視化について書かれている。

3章先頭でtrain.pyを書き直しているが、これはやめてダウンロードページからtrain_with_eval.pyを落としてそのまま使用した。
次のvisualize_weights.pyがダウンロードページにないので、似たファイルvisualize_filter.pyをコピペして本に書いてあるとおりに書き直す。

フィルタというのは畳み込み層で使用した5×5の小窓(3チャネル(色))で、CIFAR10データを畳み込む場合ステップ1で合計64枚必要になる。

機械学習の学習はウェイトWとバイアスbの値を調整していく作業なので、このWの値がどう学習で変化していくかを可視化するために、3章ではfloatを0~255のuint8に変換して、ビットマップの色データにかえ、これをタイル上にしたビットマップを作るという視覚化のやりかたを教えてくれているのだ。

実際にやってみた結果を順番にならべgifアニメにしてみたのがこれ(ビットマップはgifアニメ変換時に勝手に拡大されている)。



こんなかんじに学習していってるのね..

と、ここまでのコードにコメントをつけてまる7日..

この薄い本、1ページ1ページが重い..

先は長いなあ..


それより、勉強を初めてずーっと気になっていること。

「なんでニューラルネットワークモデルを構築して学習させていくと、分類やら予測やらができるの?」

実はよくわかってないらしい..

コラム:注意事項
本章で実施する工夫については、筆者はその原理を理解しているわけではありません
TensorFlowのチュートリアルを見たり、先行して効果があるとされているモデルを参考にして実施しています。もし原理に興味がある人は、専門書などを参考にしてください。
また、畳込みニューラルネットワーク(CNN)を勉強していると「なぜうまく行くのかよくわかっていない」ということがあります。層の数や組み合わせや設定する値のベストプラクティス、なぜそれが高い効果をもたらすのか理論的な裏付けなどを皆で探しているのが現状のようです。

※書籍「TensorFlowはじめてみました」第4章p46より引用


..一部はわかっているものもあるのだろうけど、
結果としてうまく行っているから使ってしまおう
ってことのようです。

それって...

ディープラーニングって丸山ワクチン村井ワクチンとおんなじじゃないの?!

村井のクスリはよく効く


からって..

自動車や飛行機を運転させたり、


病気診断させたり、



自動投資につかったり、


いいのかね、倫理的に..

0 件のコメント:

TensorFlowにおけるフィーチャ列はこうしてね的なブログ記事を翻訳してみた

TensorFlow 1.4.0 になってイロイロガチャガチャしている。 一番ビックリしたのがTutorialのSequence-to-Sequence。 イキナリブログ記事のリンクだけになっていた.. Sequence-to-Sequence Models ht...