# tensorflow tensorflow的核心為『計算圖』,其可分為建立計算圖與執行計算圖 ![](https://i.imgur.com/BjhNx6W.png) **Back Propagation反向傳播演算法**: ![](https://i.imgur.com/1FaOApM.png) 經過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就好,有很多改動,遇到了要再去查 ![](https://i.imgur.com/8Mojwbx.png) placeholder寫成一個function即可(forward),可以直接用numpy創立一個空的陣列 session可以直接不用 ### TensorFlow_Board_area 視覺畫的方式來看創造的計算圖 ### TensorFlow_Tensor_neural 以TensorFlow張量(矩陣)運算,來模擬類神經網路的運算 要先建立一個layer的function,之後呼叫這個function就可以建立層數 ![](https://i.imgur.com/HV01kj0.png) 建立層數 ![](https://i.imgur.com/jvzz2XU.png) 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辨識手寫數字 ![](https://i.imgur.com/K8FZSdn.png) #### 建立模型 在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 ![](https://i.imgur.com/CyRx9Vy.png) ![](https://i.imgur.com/2wDg2YW.png) ![](https://i.imgur.com/jiO1bRq.png) ![](https://i.imgur.com/hlwzIKG.png) ### 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 ![](https://i.imgur.com/EA3Rfr3.png) 訓練:經過資料預處理產生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為正面評價或負面評價 ![](https://i.imgur.com/hVgbyCR.png) 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
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up