TensorFlowの使い方およびJupyter notebookのTips

※以下、個人的な勉強のためのレポートです。
※間違い多々あると存じますが、現在の理解レベルのスナップショットのようなものです。
※勉強のためWebサイトや書籍からとても参考になったものを引用させていただいております。
http://ai999.careers/rabbit/

# Tensorflowの実装演習(を始めるにあたって)
※Tensorflowのインストール方法として、pipを使う方法がネットには多くあります。しかし、AnacondaでPython環境を構築している場合、pipとcondaの競合により環境に不具合が生じることがあるようです。よって、AnacondaでPython環境を構築している場合は、Anaconda NavigatorからGUIでインストールする方が安全なようです。
https://www.sejuku.net/blog/43784
http://onoz000.hatenablog.com/entry/2018/02/11/142347

### TensorFlowの動作確認

```
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

b'Hello, TensorFlow!'
```
※出力に「b'」と付くのは、「byte文字列」であることを示しているらしい。
https://stackoverflow.com/questions/40904979/the-print-of-string-constant-is-always-attached-with-b-intensorflow


## TensorFlowの基礎

### TensorFlowとは
https://ja.wikipedia.org/wiki/TensorFlow
TensorFlow（テンサーフロー)とは、Googleが開発しオープンソースで公開している、機械学習に用いるためのソフトウェアライブラリ。

### TensorFlowの位置づけ
https://qiita.com/shu_marubo/items/d9c306f7f3fb82dc55e7
機械学習を使う際に、 
1.アルゴリズム、数理を正しく理解した上で、各言語でモデルをフルスクラッチで作る
2.pythonならsklearn、Rなら手法に応じた各ライブラリなどを用いて数行でモデルを作成する
3.機械学習系のモデルを作成するのに向いた計算ライブラリを用いて自作する
Tensorflowは「3.」の用途に該当する。

### Tensor(テンソル)とは、Flowとは
https://www.sejuku.net/blog/38134
https://qiita.com/rindai87/items/4b6f985c0583772a2e21
https://qiita.com/edo_m18/items/7c95593ed5844b5a0c3b
Tensorは数学用語ではあるが、機械学習の文脈では「多次元配列」のことと考えて進める。Flowは「流れ」。ニューラルネットワークのモデルは、計算グラフで説明されることが多い。よって、TensorFlowは、多次元のデータ構造を計算グラフの流れのように処理できるライブラリと考えられる。

計算グラフにおける各ノードは演算を表しており、その演算の入力（オペランド）と結果はテンソルである。

テンソルの形状は、shapeの概念により決定される。
https://deepage.net/tensorflow/2018/10/03/tensorflow-shape.html

```
shape=[2,2]
```
2個の要素を持つ2次元配列

```
shape=[3,2,2]
```
2個の要素を持つ2次元配列が3つ(3次元配列)

### TensorFlowのノードの型
dtypeで指定可能　ex)tf.float32	32ビットの浮動小数点数
https://deepage.net/tensorflow/2018/10/09/tensorflow-dtype.html

### TensorFlowのプレースホルダ
https://lp-tech.net/articles/SE5xD
プレースホルダは、後でデータを割り当てるをために用意されたテンソル。これにより、データを必要とせずに操作を作成し，計算グラフを作成することができる。

プレースホルダにデータを送るには feed_dict を使用する。Python の数値・文字列・リストや，Numpy の ndarrays を送ることが可能。

```
import tensorflow as tf
import numpy as np

a = tf.constant(3)
b = tf.placeholder(dtype=tf.int32, shape=None)
c = tf.add(a, b)

with tf.Session() as sess:
    print(sess.run(c, feed_dict={b: 1}))
    print(sess.run(c, feed_dict={b: [1, 2, 3, 4]}))
    print(sess.run(c, feed_dict={b: np.random.randint(0, 9, 10)}))
    
# 以下，実行結果
# 4
# [4 5 6 7]
# [ 4  7  8  4  7  3  4  9 10  4]
```

### TensorFlowの変数


### TensorFlowのセッション
https://www.atmarkit.co.jp/ait/articles/1804/20/news131_2.html
TensorFlowのセッションとは、構築されたデータフローグラフの演算処理を実際に行うランタイムへのクライアントのこと。

### TensorFlowの、定数と簡単な演算、変数、プレースホルダーの使い方
https://note.nkmk.me/python-tensorflow-constant-variable-placeholder/
〇定数の定義

```
import tensorflow as tf

const1 = tf.constant(5)
const2 = tf.constant(10)
```

〇定数値の確認

```
print(const1)
print(const2)
Tensor("Const_13:0", shape=(), dtype=int32)
Tensor("Const_14:0", shape=(), dtype=int32)
```
そのままprint()しても値は表示されない。
tf.constant()では、あくまでも計算グラフが定義されただけ。実際の値を確認するにはセッションを開始して処理を実行する必要がある。

```
with tf.Session() as sess:
    const1_result, const2_result = sess.run([const1, const2])
    print(const1_result)
    print(const2_result)
5
10
```
https://www.sejuku.net/blog/24672
Pythonのwith構文は、ファイルの読み込みが必要なコードで使用される。with構文を使うとファイルの読み込みで必要なclose処理を省略することが可能。よってセッションを開き、読み、閉じる処理を記述。
※セッションという実行環境へのアクセスと考える？

〇四則演算
https://qiita.com/negabaro/items/bdaeaf6ba4bc9fc81208
加算　tf.add(x, y, name=None)
減算　tf.sub(x, y, name=None)
乗算　tf.mul(x, y, name=None)
除算　tf.div(x, y, name=None)

### TensorFlowの変数
https://note.nkmk.me/python-tensorflow-constant-variable-placeholder/
tf.Variable()で定義
tf.assign()で新たな値を代入
変数はセッションのはじめに初期化する必要がある。
すべての変数を初期化するglobal_variables_initializer()を実行

```
import tensorflow as tf
import numpy as np

var = tf.Variable(10)
const = tf.constant(5)
calc_op = var * const
assign_op = tf.assign(var, calc_op)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    print(sess.run(var))

    sess.run(assign_op)
    print(sess.run(var))

```

セッション内では変数の値は保持されるため、オペレーションを複数回実行すると結果が更新されていく

```
import tensorflow as tf
import numpy as np

var = tf.Variable(10)
const = tf.constant(5)
calc_op = var * const
assign_op = tf.assign(var, calc_op)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    print(sess.run(var))

    sess.run(assign_op)
    print(sess.run(var))
    
    sess.run(assign_op)
    print(sess.run(var))
    
    sess.run(assign_op)
    print(sess.run(var))
    
    sess.run(assign_op)
    print(sess.run(var))
10
50
250
1250
6250
```

## Pythonのreshape(-1,1)について
https://qiita.com/guitar_char/items/deb49d5a433a2c8a8ed4
〇reshapeの一つのサイズが決まっているとき、もう一方を-1とすると、-1には元の形状から推測された値が入る
http://www.kamishima.net/mlmpyja/nbayes2/shape.html
〇shape に (1, -1) や (-1, 1) を指定すると，それぞれ2次元の横ベクトルや縦ベクトルを簡便に作ることができる。

# Jupyter notebookを使う上でのTips
〇matplotlibの出力
import matplotlib.pyplot as plt
%matplotlib inline
https://qiita.com/nogut0123/items/2c83e30e274e5a51cb41

〇ディレクトリの変更
https://qiita.com/k-serenade/items/af8701101fe50397d8aa
Windowsの場合
(ex)Cドライブではないパーティション(E)の直下にjupyterというフォルダを作っていて、そこにnotebookのソースを置いている・置きたい場合

```
c.NotebookApp.notebook_dir = 'E:\jupyter'
```

〇まずは覚えるべき使い方
https://qiita.com/takuyanin/items/8bf396e7b6b051670147
Ctrl+Cでコード実行
Shift+Cで次のセルを作成

〇覚えておくべきショートカット
https://qiita.com/masafumi_miya/items/6524dbd227705351a00c
escを押下後、hでヘルプ
escを押下後、yでコード記述モード
escを押下後、mでマークダウン記述モード