# tensorflow
tensorflow的核心為『計算圖』,其可分為建立計算圖與執行計算圖

**Back Propagation反向傳播演算法**:

經過model訓練完後與label比較得到誤差(loss function)再經過優化器(ex.SGD)回去微調參數權重與偏差來讓model更好
### Tensorflow_Basic
**建立計算圖:**
1.建立常數:ts_c = tf.constant(2,name='ts_c')
2.建立變數:ts_x = tf.Variable(ts_c+5,name='ts_x')
**執行計算圖:**
利用session來溝通:sess=tf.Session()
起始話所有TensorFlow global參數:init = tf.global_variables_initializer()
sess.run(init)
執行常數:sess.run(ts_c)
執行變數:sess.run(ts_x)
關閉session:sess.close()
利用with語法來避免忘記關閉session
如要在執行計算圖時在傳入數值,可以用placeholder
現在新版本Tensorflow2.0好像可以不用session直接用print就好,有很多改動,遇到了要再去查

placeholder寫成一個function即可(forward),可以直接用numpy創立一個空的陣列
session可以直接不用
### TensorFlow_Board_area
視覺畫的方式來看創造的計算圖
### TensorFlow_Tensor_neural
以TensorFlow張量(矩陣)運算,來模擬類神經網路的運算
要先建立一個layer的function,之後呼叫這個function就可以建立層數

建立層數

X是數入層,H是隱藏層,Y是輸出層,若沒有激勵函數就預設none
### Tensorflow_Mnist_Introduce
以Tensorflow的語法下載Mnist資料集,下載在MNIST_data資料夾,裡面直接把資料分為train data, validation data, test data,這樣再之後train時不用像Keras那樣去乘valid_split比率做驗證資料
### Tensorflow_Mnist_MLP_h256
建立MLP辨識手寫數字

#### 建立模型
在Keras時指只需要model=Sequential(),在使用model.add(),但在這裡需要自行定義layer函數,然後用layer函數建構MLP
1.建立layer函數
2.建立輸入層
3.建立隱藏層
4.建立輸出層
#### 定義訓練方法
Keras只需要model.cpmpile(設定損失函數,優化器,精準度評估方式)就好,但Tensorflow都要自行去設定
1.定義label
2.定義loss function
3.定義優化器
#### 定義評估模型方法
1.計算每一筆資料是否正確(Equal)
2.計算預測正確平均
#### 進行訓練
Keras用model.fit即可,Tensorflow需寫程式碼控制每一過程
先定義訓練參數,例如訓練週期,每批次多少資料,然後開始訓練
#### 評估模型準確率
#### 進行預測
### Tensorflow_Mnist_MLP_h1000
把原本只有256個隱藏層神經元改為1000個,在建立模型時那改
### Tensorflow_Mnist_MLP_h1000-h1000
把原本一個隱藏層新增加為兩個隱藏層,也次在建立模型那更改
### Tensorflow_Mnist_CNN
多加了cnn去處理影像
## keras




### keras_mnist introduciton
介紹mnist的基礎操作與裡面的data及label
### Keras_Mnist_MLP_h256
資料預處理->建立模型->訓練模型->評估->進行預測
**資料預處理**:1.reshape然後在除255標準化
2.label值轉成(np.utils.to_categorical())onehot code
**建立模型**:1.先建立一個線性堆疊模型,之後只要model add就可以加層
2.建立層數(dense(輸入層、隱藏層、kernal_initializer、activation函數))
**訓練模型**:1.設定compile方法(loss函數、優化器、評估方法)
2.用model.fit(正規化後的x train、轉成onehot code的y train、valid_split(訓練測試比率)、epochs(次數)、batch(批次數量))訓練
**評估**:1.model.ecaluate(正規化後的x test、轉成onehot code的y test)
2.會存在score
**進行預測**:用model.predict_classes(x_test)
結果存在predict
*混淆矩陣*:用來看哪個數字最易錯
### keras_Mnist_MLP_h1000
隱藏增加為1000
### keras_Mnist_MLP_h1000_Dropout
1.每次訓練迭代時,隨機在隱藏層中放棄神經元(Dropout)避免overfitting
2.在層數中加入model.add(Dropout(0.5))
### Keras_Mnist_MLP_h1000_DropOut_h1000_DropOut
加入再一層隱藏層和Dropout(0.5)
但是準確率不能再高了,要再提升需要用到cnn
### Keras_Mnist_CNN
CNN與MLP差別:CNN在進入reshape前增加了捲基層與池化層個2個做preprocess
1.第一次捲積會與16個filter各自做處理所以會變成16個影像,每個影像各自提取不同的feature(16個28x28影像)
2.第一次max-pool(縮減取樣)會變成16個14x14影像
### Keras_Cifar_CNN_Introduce
CIFAR-10資料網址:https://www.cs.toronto.edu/~kriz/cifar.html
介紹CIFAR-10的基礎操作與裡面的data及label
### Keras_Cifar_CNN
用CNN神經網路去辨識Cifar影像
### Keras_Cifar_CNN_Deeper_Conv3
用CNN神經網路去辨識Cifar影像,但是用了三層,準確率更高
### Keras_Cifar_CNN_Continue_Train
有時候train一個模型可能會花很多的時間,或是tarin到一半停電甚至當機,所以可以讓epochs(訓練週期)一次不要太多,使用model.save_weights(目的地)存此次跑完的模型權重
之後再用 model.load_weights(目的地)讀取即可
### Keras_Taianic_Intrduce

訓練:經過資料預處理產生9個feature與label(是否生存),再輸入多層感知器模型做訓練
預測:預處理後會有9個feature,再產生預測節果
1.資料先由pandas的dataframe做處理
2.將資料轉為陣列
3.再用sklearn的preprocessing去標準化
4.分train data 與test data
5.分好的train data與test data在帶入上面做預處理的函式
### Keras_Taianic_MLP
將預處理好的taianic資料丟進我們設定的的model訓練
epochs:訓練週期(訓練幾次)
batch_size:每一批次幾筆資料
所以假設每一訓練週期有930筆資料,分為每批次30筆資料,所以共要31批次
**意義:**給你feature汲label訓練出model,之後再丟入新data(feature)經過model來看看他預測的結果(生或死),在這裡試用分類(cross-entropy)來用機率看存活率
### Keras_Imdb_Introduce
Imdb共有50000比影評文字,分為個25000筆training data語test data,每一筆都被label為正面評價或負面評價

1.讀取資料集
2.因為深度學習model只接受數字,所以要將文字轉成數字,這時就要建立Token(類似字典,將train data中的最常出現的2000個文字轉換成數字)
*建立token辭典:*
token = Tokenizer(num_words=2000)
token.fit_on_texts(train_text)
3.建立好Token轉換好後就將數字轉乘list形式
*依照2所建立好的辭典轉換成數字list:*
x_train_seq = token.texts_to_sequences(train_text)
x_test_seq = token.texts_to_sequences(test_text)
4.截長補短成每個list有100個數字
x_train = sequence.pad_sequences(x_train_seq, maxlen=100)
x_test = sequence.pad_sequences(x_test_seq, maxlen=100)
5.使用Embedding層,因為數字與數字間看不出來其關聯,所以將數字list轉成向量list(可能多維)來區分每個字間的關係(遠近)
### Keras_Imdb_MLP
用上訴preprocessing好的data訓練
1.第一層先經過Embedding層
model.add(Embedding(output_dim=32,input_dim=2000,input_length=100))
2.平坦層,共3200個神經元(32維x100個數字)
### Keras_Imdb_MLP_Large
因為上面字典只用了2000個字,且數字list長度只有100個數字,造成準確率只有0.8
現在使用3800個字建立字典,且數字list有380個字
可提升準度到0.85
### Keras_Imdb_RNN
之前處理的mnist或Cifar都不會隨著時間而改變,所以使用MLP或CNN就可有不錯的效果。但像這種自然語言處理、視訊影片、氣象觀測資料、股市這種會隨著時間序列改變的,適合用RNN或LSTM模型
RNN原理為將神經元的輸出,再接回神經元的輸入,這樣的設計使網路有記憶的功能
與上面MLP的差別只是將平坦層換為RNN層
model.add(SimpleRNN(units=16))
準確率約為0.84
### Keras_Imdb_LSTM
有時在RNN網路,會有long-term dependencies問題(RNN會忘記很久之前說的資訊),這是由於其在訓練時會遇到梯度消失或梯度爆炸(訓練時再計算或反向傳播,梯度傾向於在每一時刻遞增或遞減,經過一段時間會發散到無窮大或0)
所以有了LSTM來幫助記住或忘記長期記憶
與上面MLP的差別只是將平坦層換為LSTM層
model.add(LSTM(32))
準確率約為0.86
## tensorlayer