Please enable JavaScript.
Coggle requires JavaScript to display documents.
深度學習(Tensorflow、Keras) (Keras (是一個開放原始碼,基於Python高階深度學習的程式庫…
深度學習(Tensorflow、Keras)
-
TensorFlow
-
建模步驟(以regression問題為例):
建立資料集、套用placeholder
製作add_layer(設定權重、偏差、激勵函數、輸出)
建立add_layer作為輸入層(輸入資料集、輸出為下一層的輸入)
建立add_layer作為輸出層並產出預測值(輸入為上一層的輸出)
計算loss
透過loss資訊去最佳化模型
初始化所有變量
開始跑模型
TensorFlow 的基本運算單位是張量(Tensor),張量的維度可以是零(零維張量是純量,Scalar)、可以是一(一維張量是向量,Vector)、可以是二(二維張量是矩陣,Matrix)亦可以為 n(n 維張量)張量可以宣告為常數(Constant)、變數(Variable)或者 Placeholder 這三種類型。
即便是基礎的數值運算都有 TensorFlow 的函數可以呼叫:
+: tf.add()
-: tf.sub()
: tf.multiply()
/: tf.divide()
*: tf.pow()
%: tf.mod()
//: tf.div()這些函數都必須在TensorFlow的Session中執行才會有運算結果的輸出,否則只是顯示張量物件的資訊而已。
tf.Session() 創建出一個 Session 並且在其中執行這些數值運算
x = tf.constant(8)
y = tf.constant(5)
tf_add = tf.add(x, y)
print(tf.Session().run(tf_add))使用 TensorFlow 的函數定義運算方法是正規的作法,但並不是唯一作法,更多時候我們喜歡直接使用與 Python 數值運算一模一樣的運算符號來對張量進行運算,但即便單純使用運算符號,同樣記得必須在 Session 中執行。
x = tf.constant(8)
y = tf.constant(5)
tf_add = x + y
print(tf.Session().run(tf_add))利用tf.Session()建立 Session 後再執行數值運算是正規的 TensorFlow 寫法,但資料科學家嫌麻煩,這時可以選擇以tf.InteractiveSession()互動模式啟動 Session,執行運算變為呼叫張量的.eval()方法,使用完畢之後呼叫 Session 的 .close() 方法關閉互動模式。
sess = tf.InteractiveSession()
x = tf.constant(8)
y = tf.constant(5)
tf_add = x + y
print(tf_add.eval())
sess.close()除了使用 tf.constant() 創造常數張量以外,常用的建構函數有:
tf.zeros() :建構內容數值皆為 0 的常數張量
tf.ones() :建構內容數值皆為 1 的常數張量
tf.fill() :建構內容數值皆為特定值的常數張量
tf.range() :建構內容數值為 (start, limit, delta) 數列的常數張量
tf.random_normal() :建構內容數值為符合常態分佈數列的常數張量
tf.random_uniform() :建構內容數值為符合均勻分佈數列的常數張量常用的矩陣建構與計算函數有:
tf.reshape() :調整矩陣外觀
tf.eye() :建構單位矩陣
tf.diag() :建構對角矩陣
tf.matrix_transpose() :轉置矩陣
tf.matmul() :矩陣相乘熟悉 NumPy 的 Python 使用者來說學習 TensorFlow 有很大優勢,除了 ndarray(n 維陣列)觀念與 Tensor(n 維張量)觀念類似以外,TensorFlow 函數的命名、參數與設計理念亦與 NumPy 相去不遠。將值宣告賦值給變數(Variables),這在 TensorFlow 中是以 tf.Variable() 來完成,就像是在 Python 中簡單宣告變數一般。宣告變數張量並不如 Python 或者先前宣告常數張量那麼單純,它需要兩個步驟:
- 宣告變數張量的初始值、類型與外觀
- 初始化變數張量
lucky_number = tf.Variable(24, name = "lucky_number")
tf.Session().run(lucky_number.initializer)
print(tf.Session().run(lucky_number))
初始化成功後的變數張量,可以透過 .assign() 方法賦予不同值
assign_op = lucky_number.assign(7)
tf.Session().run(assign_op)值得注意的地方是對變數張量重新賦値這件事對 TensorFlow 來說也是一個運算,必須在宣告之後放入 Session 中執行,否則重新賦值並不會有作用。
lucky_number = tf.Variable(24, "lucky_number")
assign_op = lucky_number.assign(7)
tf.Session().run(lucky_number.initializer)
print(tf.Session().run(lucky_number))變數張量一但被宣告之後,重新賦值時必須要注意類型,賦予不同類型的值會得到 TypeError。不僅是值的類型,外觀也必須跟當初所宣告的相同,賦予不同外觀的值會得到 ValueError。這跟 Python 動態型別(弱型別)的特性非常不一樣,反而和靜態型別(強型別)程式語言更相近;使用 TensorFlow 的 Python API 接口就好比將一個嚴謹的靈魂置放在活潑的軀殼之中,已經習慣動態型別的 Python 使用者可要特別注意。第三種在 TensorFlow 中張量將被宣告的類型稱為 Placeholder,我們可以將它對照為像是在佔有一個長度卻沒有初始值的 Python None、或者是 NumPy np.NaN,差異在於 None 或 np.NaN 不需要將之後想要擺放的資料類型預先定義,但是 Placeholder 張量和變數張量一樣,必須預先定義好之後欲輸入的資料類型與外觀。使用 tf.placeholder() 可以建出 Placeholder 張量,未來利用 TensorFlow 訓練機器學習與深度學習的模型時,將會使用 Placeholder 將 X 與 y 的資料輸入計算圖形。
tf_placeholder = tf.placeholder(tf.int32, shape=(3))那麼宣告完 Placeholder 張量以後,又該如何將資料輸入?TensorFlow 的術語稱作是Feed dictionaries,意即將資料以 Python dict 餵進(Feed)Placeholder 張量之中,而 TensorFlow 術語則將完成計算後的輸出資料稱作是 Fetch,是 ndarray 的類型。
tf_placeholder = tf.placeholder(tf.int32, shape=(3,))
with tf.Session() as sess:
lucky_numbers = sess.run(tf_placeholder, {tf_placeholder: [7, 24, 34]})
print(lucky_numbers)
epoch(週期):
一個完整的資料集通過了神經網路一次並且返回了一次,
例如訓練資料集有5000筆,這5000筆跑一次正反向傳遞是一個epoch。
不過在訓練過程中,所有資料完整跑一次是不夠的,
需要將完整的資料集在同樣的神經網路中傳遞多次。
隨著epoch數量增加,神經網路中的權重的更新次數也在增加。
資料的多樣性會影響合適的epoch的數量,並沒有正確的答案。
batch(批次):
在不能將資料一次性通過神經網路的時候,就需要將資料集分成幾個batch。
我可以自行設定每跑一次正反向傳遞要用多少筆樣本,也就是多少batch
iteration(迭代):
是batch需要完成一個epoch的次數。
每跑一次正反向傳遞是一個iteration,
而這一次iteration跑多少筆資料就是batch,
epoch則是全部資料跑完才算一次。
迭代是重複反饋的動作,神經網路中我們希望通過迭代進行多次的訓練以達到所需的目標或結果。
每一次迭代得到的結果都會被作為下一次迭代的初始值。
EX:
訓練集有1000個樣本,batchsize=10,
那麼訓練完整個樣本集需要100次iteration,1次epoch。
訓練集有2000個樣本,將2000個樣本分成大小為500的batch,
那麼完成一個epoch需要4個iteration。
-
-
Q:反向傳播概念&梯度下降法,應該是所有監督式學習演算法通用的training機制?!
A:梯度下降是最佳化的一種,而反向傳播是梯度下降在深度學習領域變化而來的
Q:還是說只有感知器適用?
A:承上,錯!! (我之前還以為對...)
Q:我學的都是基於梯度下降求解的機器學習問題?
A:如同上述,梯度下降用於很多演算法的最佳化
Q:梯度下降是NN用的最佳化的方法?
A:是,但不限NN,應該是其他模型也都適用此概念去做最佳化,不然弘毅與軒田大神就不會第一堂可就介紹
多層感知機、以及反向傳播的訓練算法,都是由早期Hinton提出,但當時遇到梯度下降問題以及SVM當紅而被冷落,待深度學習概念出來後,多層感知機又再次被重視
*感知器就是類神經網路實做出來的演算法,單層的感知器沒啥用,因為不能解決非線性可分問題,不如用同樣是淺層的SVM等演算法。現在說的都是多層感知器
Neural Network求算模型中最重要的參數 -- 『權重』(Weight),這個過程就稱為『最佳化』(Optimization),最常用的技巧就是『梯度下降』(Gradient Descent)
莫煩:神經網路基本原理就是梯度下降機制,梯度下降法就是一種最佳化optimization模型的方法。其餘好用的optimizer還有MomentumOptimizer、AdamOptimizer、RMSPropOprimizer
莫煩-activation function:
激勵函數是為了解決不能用線性方程所概括的問題。簡單說把激勵函數套在線性方程,就會把線性方程掰彎成非線性方程,呵呵,而這個激勵函數其實就是一個非線性方程,例如relu、sigmod、tanh。
若神經網路的隱藏層不多,則激勵函數隨便選,但若很多曾就要慎選,不然可能造成梯度爆炸或梯度消失。
讓某一部分神經元先激活起來,然後把激活效應的信息傳遞到後一層神經系統。例如某些神經元看到貓圖片的眼睛特別感興趣,表示該神經元被激勵了,它的數值就會提高。
TF流程圖簡單說一下是input資料後,經過隱藏層(假設2層),然後就有一個預測值,然後再去和真實值對比差距(loss function、cross_entropy)。細看隱藏層2,激勵函數就在這裡面,隱藏層2就是把隱藏層1輸進來的值進行加工(一個方程式),再透過激勵函數判斷是否要被激活或deactivate,再繼續傳遞下去。
莫煩-神經網路:
輸入層:負責傳遞接收到的訊息。
隱藏層:有N層,傳送訊息加工處理,每過一層特徵值就變化一點。
輸出層:輸出結果。
訓練方式:需要很多數據,機器透過區分正確與預測答案的差別,將差別反向傳遞回去對每個神經元向正確方向改變一點點,成千上萬次後就會準確了。而且每個神經元都有刺激(激活)函數,用這些函數給計算機刺激行為,當機器第一次辨識圖片時可能只有部分神經元被激活,若預測不對則所有神經元的參數被調整,每次辨識都激活不同神經元,慢慢的所有神經元參數被改變,然後預測出正確答案。
-
-