Python
機械学習
DeepLearning
TensorFlow
ComputationalGraph

【入門者向け解説】TensorFlow基本構文とコンセプト

More than 1 year has passed since last update.


TensorFlowの基本構文とコンセプト

公式ページのGetting Started With TensorFlowを試して、ポイントとなる点を解説していきます。この内容を理解してから「【入門者向け解説】TensorFlowチュートリアルMNIST(初心者向け)」のチュートリアルをすると理解が早いです(私はボケてすっ飛ばしていました)。


参考リンク




TensorFlowとは

TensorFlow言わずと知れたGoogle様が機械学習のために作ったオープンソースのライブラリです。

TensorFlowの"Tensor"(テンソル)は簡潔に言うと多次元配列のことです(Google固有ではなく一般的な用語です)。Tensorの詳細に関してはTensorFlowを始める前に知っておくべきテンソルのこと(追記:より一般的な話題へ)の記事が素晴らしいです。

TensorFlowはそのTensorを扱うのに長けたライブラリです。そして、機械学習に最適化すべくCPUとGPUを最大限有効に使っています。

例えば、2コアのPCでMNISTの深層学習チュートリアルを実行すると下図のようにすぐにCPUをほとんど使い切ってくれます。

20.CPU_Full.JPG


TensorFlowの基本構文とコンセプト

TensorFlowの基本構文を見ながらコンセプトを解説します。


Computational Graph

TensorFlowはComputational Graphというコンセプトに基づいており、コマンドはComputational Graphの構築と実行という2つに分類されます。

例えば、2つの定数を定義して、それらを出力する場合、C言語では以下のようになります(古い記憶なので少し違っているかもしれませんが、感覚的にそんなもんだ程度に思ってください)。

const double node1 = 3.0;

const double node2 = 4.0;
printf("%f, %f", node1, node2);

それを通常の言語感覚でTensorFlowで書くと、下記になります。

node1 = tf.constant(3.0, dtype=tf.float32)

node2 = tf.constant(4.0) # also tf.float32 implicitly
print(node1, node2)

しかし、上記で出力されるのは、下の結果です。定数の3.0と4.0出力されません。これは上記構文が「Computational Graphの構築」だからです。「Computational Graph」は並列可能性、処理順序を考慮した処理計画だと考えてください。

Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)

実際に定数の値を出力するには、以下の構文で「Computational Graphの実行」をする必要があります。

sess = tf.Session()

print(sess.run([node1, node2]))

これで、ようやく3.0と4.0が下記のように出力されます。

[3.0, 4.0]

図解するとこんな感じです。

30.ComputationalGraph01.JPG


まとめ

通常の言語処理と比較すると下図のようになります。Computational Graphによって構築(計画)と実行の2ステップになるのが特徴です。単純にDBにレコードを登録するような処理であれば、1CPUのみを使った通常の言語処理の方がシンプルでいいですが、機械学習やDeep Learningのように複雑で並列化メリットの大きい場合はTensorFlowの方が適切でしょう。

筆者の経験では、Spark, Hadoop, SAP HANAなんかもComputational Graphと近い形の処理並列化が可能です。

30.ComputationalGraph02.JPG