というわけでいくつかエントリ上げているのですが、TensorFlowに手を出しており。
機械学習、ディープラーニング自体が全く知らないことだらけで迷走気味ですががんばっていきています。
それで表題。Pythonも初心者、機械学習も初心者で今までやってきたこととは考え方やコードの読み方が違っておりまして。そんな状態で読み解いていったときに、先にこれに気づいていれば…ということをまとめてみました。
この解釈もまだ的外れかもしれませんが…今の段階の理解ということで
TensorFlowは式のパラメータを自動調整してくれるもの
まず大きな誤解だったのがこれ。TensorFlowはTensorを使って組んだ式の中にある変数(Valiable)を訓練データから自動調整してくれる、そしてその調整済みパラメータを当てはめた式で、訓練データ以外のものを解析するとそれに沿った結果が得られるというものであって、特徴データを記憶して一致率何%みたいなものを出してくれるものではないんですね…(そう作ればそうできるのかもしれないけど?)
例えばMNIST For ML Beginnersというチュートリアルには、
W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) y = tf.nn.softmax(tf.matmul(x, W) + b)
というsoftmax関数を使った式が組まれていますが、この式が最適になるように、訓練データからW(重み)とb(バイアス)を見つけ出すのがTensorFlow。
まずここのイメージが全然違っていて、訓練データを食わせれば食わせるだけ蓄積されたデータから何かが導き出されていると思ってたから話がいろいろと理解できなかった…
あとディープラーニングというのもイコール機械学習ではなく、機械学習の一分野、というところらしい。
式の構築と実行が別
これも直感的にわからなかったポイント。
TensorFlowでは、式の構築とそれの実行は別々になっています。
例えば、
y = tf.nn.softmax(tf.matmul(x, W) + b)
という行があると、yに結果が入っているように思えるのですがそうではなく、yには構築された式が入っています。
それで、これをSessonで実行すると結果が得られる。
sess = tf.Session() sess.run(y)
ただし、構築中はあたかもyが結果を受け取ったかのように他の式に組み込まれていくので、Python流の「配列をまとめて処理する」的な書き方と合わさって、そのあたりがちょっと混乱していました。
これはTensorFlow自体の仕組みも絡んでいて、Sessionの中でC++のコードを実行をしているらしく、これによって高速化、分散化(Tensor単位で処理が振れる?)などが図れるのかなと思ってます。
なおSessionには種類としてSessionとInteractiveSessionがあり、前者はおそらくまとめてTensorFlowの処理系に渡されるが、後者はその場その場で実行して進めていってくれる簡易Sessionのようなもののよう。
Pythonには対話式で実行していくモードがあるので、それなどで利用するときに使うためなのかと思います。
placeholderは引数
コードの書き方的な話。
x = tf.placeholder(tf.float32, [None, 784]) y = tf.nn.softmax(tf.matmul(x, W) + b)
というようにplaceholderを作成して式に組み込んだ場合、実際に実行するときには
sess.run(y, feed_dict={x:batch_xs})
というようにfeed_dictに計算時に入れる値を指定します。
これは動作としては、要するに関数に対する引数みたいなものですね…
訓練データなど、変動するデータ、パラメータがplaceholderとして定義され、その部分を変更した訓練、評価が行われます。
placeholder型の変数がdict型変数のキーになっているので、そのまま使います。変数で組んだ値を連想配列の文字列で指定?? とかちょっと混乱したのですが、変数そのもののハッシュをキーにしているのならたぶん納得。
また、placeholderの指定が足りないと
E tensorflow/core/client/tensor_c_api.cc:485] You must feed a value for placeholder tensor 'Placeholder' with dtype float
というエラーメッセージになります。
ShapeはPythonの配列そのままではない
Valiableやplaceholderを作るとき、式を操作していくときによく見るShape。
これはそのTensorの次元数を表していて、指定の仕方が、[None, 784]みたいな感じになります。(Noneは制限なし)
Pythonの配列としては[None, 784]はそのまま一次元配列で、
[0] = None [1] = 784
になるのですが、Shapeに指定された結果のTensorは
[(無制限)][784]
という二次元配列になります。要は定義しているだけで、それがそのまま入るわけではないのですが、ちょっと読み方として混乱していました。
データ周りにはRank、Shape、Typesというものがあり、Rankは次元数、Shapeは各次元の配列の長さ、Typesはデータ型を指定しているもののよう。
参考
その他、学習で参考になったページなどを並べていきます。
TensorFlow公式サイト。まずTutorialから。
いろいろなチュートリアル、ドキュメントを翻訳してくれているサイト。
日本語のありがたさが身にしみます…
その他検索していると、アイドルの顔判別などが出てきますが俺には難しすぎた。
でもやっていることはDEEPなほうのチュートリアルのCNNをそのまま使って判別したい画像を放り込んでいるだけかもしれないとちょっと思う程度の理解。
続いて書籍など。
機械学習入門。数学がわかれば多分読めるほどかみ砕いてあるような気がする…
ディープラーニングの手法について。まだ読めるレベルではないけどここにあるものが実装されているような雰囲気っぽいものは感じられる…
よくわかるベイズ統計。ステップを追って説明してくれて理解しやすかったけど正規分布が出てきたあたりでしんだ。ベイズ統計が概念的に、「導かれた結果を前提として新しい結果を導く」という性質のもののようでディープラーニングには欠かせないらしい。らしい…
機械学習の基本の書、みたいなのですが分厚いうえに難解らしい…いずれ挑むことになるのだろうか。
なんというか、この記事がもし何かのヒントにでもなれば幸いです。はい。
個人的には「TensorFlowはパラメータ調整をしている」「Sessionで実行している」がわかったら混乱しなくなった感じはします。先が見えない。
スポンサーリンク