文系社会人・Python初心者のTensorFlow学習方法

文系社会人でPython初心者である筆者が約3ヶ月間TensorFlowを学習しました。これから学習する方の参考になればと思い、その学習方法・時間および反省点などを書いていきます。

#サマリ
TensorFlow学習サマリとしては下表のとおりです。

|項目|内容 |
|:-----------------|:------------------|
|学習目的|直接、直近の仕事に関係ないが自己啓発|
|投稿したQiita記事|22記事<br>だいたいやったことは記事にしています|
|身につけたレベル|基礎的なDeep Learningの処理はTensorFlowで組めるようになりました<br>難しいことは当然できず、精度や品質、スピードは初心者そのもの|
|総学習時間|134h(約3ヶ月)<br>※TensorFlow以外にOpenCVとBing API学習時間の40hを含む|
|使った教材|[【4日で体験しよう！】 TensorFlow x Python 3 で学ぶディープラーニング入門](https://www.udemy.com/tensorflow/)で学びました|
|実行環境|Win10, Anaconda, TensorFlow|
|Python知識・経験|Pythonほぼ未経験|
|事前機械学習知識・経験|少しだけ仕事で学習しました|
|事前Deep Learning知識・経験|入門本すら読んだことがない状態|
|事前TensorFlow知識・経験|「何それ？」状態|
|事前数学知識|文系卒ではあるが、社会人になって高校基礎および大学基礎は簡単に学べ直した状態<br>記事[「文系卒社会人が統計・機械学習を理解するための数学勉強方法」](https://qiita.com/FukuharaYohei/items/0a66c37091dc27c71fe6)参照|
|事前開発経験|社会人最初の2年くらいでマイナー言語ABAPをみっちりやったが、最近はたまにやる程度。他言語は必要に応じて多少やる程度。|

##短評
想像の3倍くらい時間をかけてしまいましたが、色々なことが目からウロコで**大いに面白かった**です。TensorFlowエンジニアの見習い小僧レベルにはなれた気がします。とはいえ、奥が深くて本当に表面的な部分を学習しただけとも感じています。内部的な処理はわからないことだらけですし、応用どころか基本もままならない状態。あとどのくらい時間をかければ、プロと胸を張って言えるレベルになれるかは、正直見当がつかないです・・・一方でそんな状態でもオリジナルのテーマでDeep Learningが実装できるのは、本当にTensorFlowの凄さだと思います。あと、地味にAnacondaも便利で助けられました。

##学習目的
現在および直近の仕事でDeep LearningやAIはおろか、機械学習すら使わないですが、「今後を踏まえて何かしなきゃ」という強い想いのもと学習しました。また、純粋に「面白そう」という気持ちも強かったです。

##総学習時間
総学習時間である134時間の内訳はこんな感じです。Python経験あれば2/3程度に圧縮できたはず。IF文のような基礎的なコマンドも調べながら学習していったので時間がかかってしまいました。
学習にはとにかく時間が足りません。仕事と家事・育児の合間になんとか時間を捻出しました。
![10.LearningTime01_Pie.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/a109c822-1af1-449b-6d19-7f54d26e97d2.jpeg)

##使った教材
本は一切使わず、[【4日で体験しよう！】 TensorFlow x Python 3 で学ぶディープラーニング入門](https://www.udemy.com/tensorflow/)で基礎的な部分を学んだのみです。非常にわかりやすくて、コスパよかたです(確かキャンペーンで1500円くらいだった)。あとは、公式サイトのチュートリアルとネット記事で適宜学んでいきました。結局、本をその後も読んでいないので、最初に入門本を読めばよかったかの判断材料なしです。必須ではなかったことくらいしか言えないです。

#学習方法
以下の順序で学習していきました。
##1. 環境準備(約4時間)
[【4日で体験しよう！】 TensorFlow x Python 3 で学ぶディープラーニング入門](https://www.udemy.com/tensorflow/)に環境準備の内容があったので、それを参考にしながらインストールしました。Anacondaをインストールして、仮想環境にTensorFlowを入れています。**幸運なのかエラーなく簡単でした。**
>- [TensorFlowをWindowsにインストール Python初心者でも簡単だった件](http://qiita.com/FukuharaYohei/items/d8f82c827e0bae70096a)
>- [公式サイト: Installing TensorFlow on Windows](https://www.tensorflow.org/install/install_windows)

##2. MNISTを使った初心者向けTensorFlowチュートリアル(約10時間)
[【4日で体験しよう！】 TensorFlow x Python 3 で学ぶディープラーニング入門](https://www.udemy.com/tensorflow/)に同じく講習内容があったので、それを参考にしながら理解・実装しました。ただ、Udemyには[公式サイト: Getting Started With TensorFlow](https://www.tensorflow.org/get_started/get_started)の内容がなかったので、[公式サイト: MNIST For ML Beginners](https://www.tensorflow.org/get_started/mnist/beginners)の後にやりました。逆の方が効率いいです。Softmax関数は、理解する上で数学を勉強しておいてよかったと心底思いました(とは言え、中学数学レベルでも大雑把に理解できるはず)。正直このチュートリアルレベルは、**そんなに難しくない**です(勾配降下法は理解せずにとばしでいますが・・・)。ここでDeep Learningを少し侮りました。
>- [【入門者向け解説】TensorFlow基本構文とコンセプト](http://qiita.com/FukuharaYohei/items/0825c3518d8596c09396)
>- [公式サイト: Getting Started With TensorFlow](https://www.tensorflow.org/get_started/get_started)
>- [【入門者向け解説】TensorFlowチュートリアルMNIST(初心者向け)](http://qiita.com/FukuharaYohei/items/10b89275efda2a22e9c5)
>- [公式サイト: MNIST For ML Beginners]
(https://www.tensorflow.org/get_started/mnist/beginners)

##3. MNISTを使ったExpert向けTensorFlowチュートリアル(約36時間)
**難しくて結構理解につまずきました。**このチュートリアルも同じく[【4日で体験しよう！】 TensorFlow x Python 3 で学ぶディープラーニング入門](https://www.udemy.com/tensorflow/)に同じく講習内容があったので、それを参考にしながら理解・実装しました。講習内容があったおかげで、大きく時間短縮ができましたが、その講習内容だけでは圧倒的に理解が足りません。理解をするためにいろいろネットで調べて読み込んで、試して見ました(特に参考になったのは[リンク](http://qiita.com/FukuharaYohei/items/0aef74a0411273705512#%E5%87%A6%E7%90%86%E6%A6%82%E8%A6%81%E3%82%92%E5%B0%91%E3%81%97%E8%A9%B3%E7%B4%B0%E5%8C%96)に記載)。とにかく学習することが多く、その内容をQiitaにまとめながら理解をしていたら7つも記事を書いてしまいました。
特に**TensorBoardはTensorFlowを理解をする上で大いに役立つツールなので重要**です。
>- [【入門者向け解説】TensorFlowチュートリアルDeep MNIST](http://qiita.com/FukuharaYohei/items/0aef74a0411273705512)
>- [公式サイト: Deep MNIST for Experts](https://www.tensorflow.org/get_started/mnist/pros)
>- [matplotlibをインストールしてJupyter Notebookでグラフ表示](http://qiita.com/FukuharaYohei/items/01e84b3970fe0a164284)
>- [TensorFlow APIメモ](http://qiita.com/FukuharaYohei/items/f9bb9a0afd47be9ecef8)
>- [【TensorBoard入門】TensorFlow処理を見える化して理解を深める](http://qiita.com/FukuharaYohei/items/7ea120005f73cf882146)
>- [TensorFlowチュートリアルMNIST(初心者向け)をTensorBoardで見える化](http://qiita.com/FukuharaYohei/items/2834cc054a8b8884e150)
>- [公式サイト: TensorBoard: Visualizing Learning](https://www.tensorflow.org/get_started/summaries_and_tensorboard)
>- [【入門者向け解説】畳み込み処理入門(TensorFlowで説明)](http://qiita.com/FukuharaYohei/items/702eb2430ee9dfbe763a)
>- [【入門者向け解説】プーリング処理入門(TensorFlowで説明)](http://qiita.com/FukuharaYohei/items/73cce8f5707a353e3c3a)

##4. 画像認識で遊ぶ(約2時間)
[TensorFlow x Python 3 で学ぶディープラーニング入門](https://www.udemy.com/tensorflow/)に同じく講習内容があったので、それを参考にしながら実装しました。といってもコードや処理の理解はなく、Githubにある学習済みパラメータを使ったプログラムの実行のみです。**息抜きとお遊び感覚。**
ただコードは重要で、今後、画像認識するときに非常に参考になるはず。
>- [初心者がTensorFlowの画像認識を使ってお手軽に遊んでみた](http://qiita.com/FukuharaYohei/items/3bc6d83f0e24110534b2)
>- [公式サイト: Image Recognition](https://www.tensorflow.org/tutorials/image_recognition)

##5. スタイル変換(約2時間)
同じく[TensorFlow x Python 3 で学ぶディープラーニング入門](https://www.udemy.com/tensorflow/)に同じく講習内容があったので、それを参考にしながら実装しました。といってもコードや処理の理解はなく、Githubにある学習済みパラメータを使ったプログラムの実行のみです。**息抜きとお遊び感覚。**
>- [初心者がTensorFlowの画像スタイル変換を使ってお手軽に遊んでみた](http://qiita.com/FukuharaYohei/items/828f9547bb9f8fc6febe)
>- [GitHub](https://github.com/lengstrom/fast-style-transfer)

##6. OpenCV(約29時間)
TensorFlowとは異なりますが、ネット上の画像を収集して顔検出するために覚えました。こんなのがフリーで使えることに驚きです。顔検出のためのアルゴリズムを理解するのに時間がかかってしまいました。そして、大量画像に対して検出するのにいろいろ試行錯誤しています。
時間があれば[Azure Face API](https://azure.microsoft.com/ja-jp/services/cognitive-services/face/)との比較などもしてみたかったです。

>- [OpenCV3.3とPython3.6をAnacondaでWindows10へインストール](http://qiita.com/FukuharaYohei/items/5d49938ffd33d198f0c0)
>- [【入門者向け解説】openCV顔検出の仕組と実践(detectMultiScale)](http://qiita.com/FukuharaYohei/items/ec6dce7cc5ea21a51a82)
>- [openCVの顔検出でパラメータを指定して手っ取り早く検出精度を高める](http://qiita.com/FukuharaYohei/items/116932920c99a5b73b32)
>- [openCVで複数画像ファイルから顔検出をして切り出し保存](http://qiita.com/FukuharaYohei/items/457737530264572f5a5b)
>- [openCVで効率的に大量画像を顔検出するためのtips](http://qiita.com/FukuharaYohei/items/1e15d79c87f1de513eac)

##7. Bing Image Search API(約11時間)
TensorFlowとは異なりますが、ネット上の画像収集のために覚えました。**単なるAPIの呼び出し**なので、そこまで時間をかけていません。それでも11時間もかかったのは、筆者のPython経験不足からくるものです・・・ そして、１つの検索語句から大量画像を収集したかったのですが、APIの仕様なのか1000枚以上収集できなかったです([リンク](http://qiita.com/FukuharaYohei/items/6d0aefb16dd78eb03a08#%E3%82%84%E3%82%8A%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%91%E3%81%A9%E5%AE%9F%E7%8F%BE%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8)参照)。
時間があれば、Google Custom Searchなどと比較してみたかったです。

>- [PythonからBing Image Search API v5を呼び出して画像収集](http://qiita.com/FukuharaYohei/items/6d0aefb16dd78eb03a08)

##8. 柏木由紀さん顔特徴調査(約41時間)
3ヶ月の総まとめとしてのオリジナルテーマでやりました。好きなアイドルとかアニメキャラとかないので、勉強になるものとして、顔特徴をTensorFlowがどう抽出しているかを調べてみました。今までのコーディングはチュートリアルに毛が生えた程度でしたが、ようやくもう少しオリジナル性のあるコードに取り組めました。**内部的な仕組みを理解していく過程は面白い**ですね。
>- [【TensorBoard入門:image編】TensorFlow画像処理を見える化して理解を深める](http://qiita.com/FukuharaYohei/items/fae6896e041235033454)
>- [TensorFlow理解のために柏木由紀さん顔特徴を調べてみた【前編】](http://qiita.com/FukuharaYohei/items/c3fb29fc8b42e0dfad0f)
>- [TensorFlow理解のために柏木由紀さん顔特徴を調べてみた【中編】](http://qiita.com/FukuharaYohei/items/1192ca038b0052ef300f)
>- [TensorFlow理解のために柏木由紀さん顔特徴を調べてみた【後編】](http://qiita.com/FukuharaYohei/items/3f26bfe71fdb5720ce7e)

##9. TensorBoard Projector(約2時間)
中途半端な思いがあり、ついでに学習しました。見た目かっこいいのが好きなので・・・正直、おまけレベルです。
![TensorBoardProjector.gif](https://qiita-image-store.s3.amazonaws.com/0/134273/f0333f2f-f02d-a08f-4cbb-e1fa784e9d83.gif)
>- [【TensorBoard入門:Projector編】TensorFlow処理をかっこよく見える化](https://qiita.com/FukuharaYohei/items/70f702ee85e23b5b1e26)

# 今後やりたいこと
NLP(自然言語処理)や画像認識の精度向上などいろいろやりたいです。ただ、時間は限られているのでどうするか決めきれていないです。いつか「TensorFlow理解のために柏木由紀さん顔特徴を調べてみた」シリーズのリベンジもしたいです。