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

#TensorFlowの基本構文とコンセプト
公式ページの[Getting Started With TensorFlow](https://www.tensorflow.org/get_started/get_started)を試して、ポイントとなる点を解説していきます。この内容を理解してから[「【入門者向け解説】TensorFlowチュートリアルMNIST(初心者向け)」](http://qiita.com/FukuharaYohei/items/10b89275efda2a22e9c5)のチュートリアルをすると理解が早いです(私はボケてすっ飛ばしていました)。

######参考リンク
> - [TensorFlowをWindowsにインストール Python初心者でも簡単だった件](http://qiita.com/FukuharaYohei/items/d8f82c827e0bae70096a)
> - [【入門者向け解説】TensorFlowチュートリアルMNIST(初心者向け)](http://qiita.com/FukuharaYohei/items/10b89275efda2a22e9c5)
> - [TensorFlowチュートリアルMNIST(初心者向け)をTensorBoardで見える化](http://qiita.com/FukuharaYohei/items/2834cc054a8b8884e150)
> - [TensorFlow APIメモ](http://qiita.com/FukuharaYohei/items/f9bb9a0afd47be9ecef8)
> - [【TensorBoard入門】TensorFlow処理を見える化して理解を深める](http://qiita.com/FukuharaYohei/items/7ea120005f73cf882146)
> - [【TensorBoard入門:image編】TensorFlow画像処理を見える化して理解を深める](http://qiita.com/FukuharaYohei/items/fae6896e041235033454)
> - [【TensorBoard入門:Projector編】TensorFlow処理をかっこよく見える化](https://qiita.com/FukuharaYohei/items/70f702ee85e23b5b1e26)
> - [【入門者向け解説】TensorFlowチュートリアルDeep MNIST](http://qiita.com/FukuharaYohei/items/0aef74a0411273705512)
> - [TensorFlow理解のために柏木由紀さん顔特徴を調べてみた【前編】](http://qiita.com/FukuharaYohei/items/c3fb29fc8b42e0dfad0f)

#TensorFlowとは
TensorFlow言わずと知れたGoogle様が機械学習のために作ったオープンソースのライブラリです。
TensorFlowの**"Tensor"(テンソル)は簡潔に言うと多次元配列のこと**です(Google固有ではなく一般的な用語です)。Tensorの詳細に関しては[TensorFlowを始める前に知っておくべきテンソルのこと(追記：より一般的な話題へ)](http://s0sem0y.hatenablog.com/entry/2016/12/01/223834)の記事が素晴らしいです。
TensorFlowはそのTensorを扱うのに長けたライブラリです。そして、機械学習に最適化すべくCPUとGPUを最大限有効に使っています。
例えば、2コアのPCでMNISTの深層学習チュートリアルを実行すると下図のようにすぐにCPUをほとんど使い切ってくれます。
![20.CPU_Full.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/42df0f5f-9b5d-1ad4-f55d-71aef2fbcb3c.jpeg)

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

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

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

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

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

```py3
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」は並列可能性、処理順序を考慮した処理計画**だと考えてください。

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

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

```py3
sess = tf.Session()
print(sess.run([node1, node2]))
```

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

```py3
[3.0, 4.0]
```

図解するとこんな感じです。
![30.ComputationalGraph01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/831bcee0-beb7-5622-b8a2-77d52b308f2c.jpeg)

##まとめ
通常の言語処理と比較すると下図のようになります。Computational Graphによって構築(計画)と実行の2ステップになるのが特徴です。単純にDBにレコードを登録するような処理であれば、1CPUのみを使った通常の言語処理の方がシンプルでいいですが、機械学習やDeep Learningのように複雑で並列化メリットの大きい場合はTensorFlowの方が適切でしょう。
筆者の経験では、Spark, Hadoop, SAP HANAなんかもComputational Graphと近い形の処理並列化が可能です。
![30.ComputationalGraph02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/77864a48-7ac7-ea3a-fd50-3955cd65a5f9.jpeg)