Re:ゼロから始めるTensorFlow2.0

# TensorFlowの概要について
## TensorFlowとは？

TensorFlowとは、GoogleがDeepLearning用に開発していたフレームワークをOpen Source化した機械学習全般をカバーするフレームワークです。

現在も多くのユーザがいて、DeepLearningといえばTensorFlowかPyTorchとまで言われるほどです。

![スクリーンショット 2019-11-25 23.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/41df58c8-d72a-d940-777d-313947676a11.png)
[Google Trendsより比較](https://trends.google.co.jp/trends/explore?date=today%205-y&q=PyTorch,TensorFlow)

## TensorFlowの強み弱み
TensorFlowが他の機械学習ライブラリよりも強い点は以下のようにあります

- Document/サポートがしっかりしている
- GPU/TPUがサポートされている
- 強力なデータパイプライン
- RESTfulAPIなどのTensorFlowをプロダクションに載せるための機能をサポート
- 様々なプラットフォームに対応している→ブラウザ、スマホやIoTなどのエッジと呼ばれる端末など
- 様々な言語にも対応→Python、C++はもちろん、RustやSwift、JSやJVM系にまで対応
上記がPyTorchやChainerなどに比べて非常に強みとなる部分になります。

一方で少し弱い点もいくつかあります。

- ラップが多く、Errorコード指摘の解釈が難しい点（非常にブラックボックス）
- Kerasデフォルトになってしまい、慣れていないとかゆいところにいまいち手が届きにくい設計
- TF1.xと2.xでドキュメントが混在してしまっているので、TF2.0からスタートすると混乱がある

## TensorFlow2.0正式リリース
今までのTensorFlowはいちいちコンパイルしないとモデルが動かない、Define and runと呼ばれる非直感的な設計であった点が、デバッグや開発、また初学者にとって大きな壁になっていました。

TensorFlow2.0からは、その点を克服し、Tensorの和や積など、その場その場でいじることができる機能、Define by runと呼ばれる機能を開発しました。これにより、ニューラルネット（以下、NN）の途中でTensorShapeをPrintしたり、NNグラフ内にif文を設置することも簡単にできるようになりました。



# TensorFlow2.0で何ができるのかざっくり紹介
## tf.keras
Kerasとは、DeepNNを構成するTensorFlowの基本的な機能です。

KerasはTF1.xの頃にできたハイレベルAPIで、難しかったTensorFlowでのモデル作成を簡単なものにするフレームワークです。TensorFlow2.0では既にKerasは統合されていて、Modelを作成する時はKerasを使うのが基本です。

Kerasは簡単なモデルだけが作成できるというイメージですが、FunctionalAPIや、SubclassAPIを利用すれば様々なモデルを自由に実装することができます。

## tf.function
TF2.0の技術の肝となるのがこの@tf.functionデコレータです。これでラップしたfunctionをTFグラフ化したコードにEncodingすることで、高速に動作するDefine by Runを実現します。新しいActivation関数を作ったり、Augmentaion関数を高速化させGPUで動作するように変換することができます。

## tf.estimator
TensorFlowで動作するsklearnといった感じの機能。Keras.Modelよりもハイレベルに抽象化されていて、
本番環境で使用するためのModuleみたいです。

Keras.Modelあたりが実験器としての役割ならば、tf.estimatorはプロダクションに載せるためのイメージ
学習のLoggingができたり、学習中の例外ハンドリングができたりなど、使用用途としてはプロダクションでのModelといったところでしょうか。

## tf.data.Dataset
塊データをBatchごとにデータを分けてくれたり、シャッフルしたり、変換をかけたりというのをチェインメソッドで書けるデータパイプラインフレームワークが`tf.data.dataset`です。ジェネレータとして機能してくれるのは色々嬉しいですし、前処理＋DataAugmentationしたい時でも結構簡単にパイプラインを引くことができます。

また、Prefetchという、GPU学習中にデータを用意しておいてくれるという超嬉しい機能があります。kerasのImageDataGeneratorやPyTorchなどではまさにデータ処理がボトルネックになっていたこともあり、データが大きいタイプの学習ではかなり役に立つ機能間違いなし！

## tf.distributed
複数のCPU/GPU/TPUで学習する機能。Batchを二つに分けて二つのGPUで同時に同じグラフを計算し、LossをAddしてBackwardしているっぽいです(詳しくは自分もわからないので[こちら](https://www.tensorflow.org/guide/distributed_training)へどうぞ)

複数のGPUを回す際にもLowレベルのAPIなので設定やら色々細かくいじれるっぽいです。

## TensorFlow_Hub
自作モデルをアップロードしてシェアしたり、転移学習目的で訓練済みのモデルをダウンロードしたりという機能です。DockerHubをイメージしていただければわかりやすいかと。

現在TF2.0用のモデルは、数がかなり少なく、利用できるのはあまりないので、今後に期待したいですね。

## TensorBoard
Kerasでの学習結果をグラフでみることができるツール。結構おなじみかもしれないですが。

<img width="699" alt="スクリーンショット 2019-11-25 23.39.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/73627f52-0a01-4214-6674-cc6ee0162ecb.png">

グラフで可視化することによって、どの程度過学習が起きているか、どうすればいいかの検討ができるなど色々と便利です。
実はColab上でも見ることができますし、最近は[TensorBoard.dev](https://tensorboard.dev/)といった、共有するツールも存在します。

## TensorFlow Extended(TFX)
TensorFlowを本番環境として構築するためのツールがTFXです。いわゆるTensorFlowServingもこの中の一つにあります。

RESTfulなAPIを提供したりといったことはお手の物。データパイプラインを作ってくれるっぽいです。

公式ページはこちら：https://www.tensorflow.org/tfx?hl=ja

## TensorFlow.js
TensorFlowをJavaScriptで動かす、つまりブラウザ上で動かすことができるTensorFlowフレームワークです。

学習と推論だけでなく、matplotlibのようなグラフまで表示することができます。
マイクロサービスでも、計算するのをエッジ側に任せることもできるので、
もしかしたら何かのサービスに使えるかもしれないですね。

https://codelabs.developers.google.com/codelabs/tfjs-training-classfication/index.html?index=..%2F..index#0

## TensorFlow Lite
App向けのTensorFlowフレームワーク。これもエッジ側で学習・推論してくれるので、何かのサービスに使える可能性も高いです。
また、最近ではIoTでAIの需要も増えていることから、単純にModelWeightを渡して推論できるだけでも面白い何かが作れるかもしれないですね。

https://codelabs.developers.google.com/codelabs/digit-classifier-tflite/index.html?index=..%2F..index#0


# 改めて、進化した強さについて
ざっと俯瞰した感じでは、データパイプラインや、Kerasとの統合による手軽なModel実装が非常に魅力的だと感じました。さらに、PyTorchやChainerにできないことが色々できるというところに強みを感じます。　GCPでTPUを使えることも他にはない魅力的です。

最近のDNNフレームワークの潮流として学術ではPyTorch、企業ではTensorFlowであるという意見もありますが、作れればそれでいいPyTorchと、プロダクションに載せるためのTensorFlowとで大きく使い道が分かれている印象があります。

アカデミックはどうだか知らないですが、企業として使うならばGCP/TFXの関係を考えても、まず使うのを考えるべきはTensorFlowなのかなと思ったり。(でも最近tf.functionの沼にはまっていて嫌になりそうですが...)



# 今回のAdventCalendar
少なくとも私の担当分では、TensorFlowを網羅的に学んでいくハンズオンができればいいなと考えています。内容はざく切りでもいいから、細かい点にフォーカスせず大きく俯瞰する形で全体理解を深めるような形にしたいとも考えています。（細かいことは全て公式で十分なので）
全体的に、埋まらなかった部分を埋めていく感じにしていこうかなと考えています。よろしくお願いいたします。