天天看點

深度神經網絡:筆記(一)

1 建立神經網絡塊

卷積神經網絡設計目的是以最小的資料處理代價直接從圖像中識别出視覺模式。

前饋網絡

每個神經元接收來自其他神經元的輸入。每個輸入項對神經元的影響由權重控制,權重可以是正的也可以是負的。整個神經網絡通過了解這種範式進而執行有效的計算來識别對象。将這些神經元連接配接成一個網絡,稱之為前饋網絡。

深度神經網絡:筆記(一)

2 Tensorflow 

計算圖,并行完成所有計算,效率高

如:

深度神經網絡:筆記(一)
深度神經網絡:筆記(一)
深度神經網絡:筆記(一)

TensorFlow的資料存儲是用一個稱之為張量的資料結構。一種由原始值組成的任意維的數組。張量的維數稱為階。如:‘hello_constant’是一個0階的常量字元串張量。

計算圖是由兩部分組成的有向圖

  • 建立計算圖
  • 運作計算圖

計算圖在會話中執行。會話是計算圖的運作時環境,負責配置設定CPU、GPU并管理TensorFlow運作時狀态。

constant_x = tf.constant(5,name='constant_x')
variable_y = tf.Variable(x+5,name='variable_y')
           

上述代碼與沒有像Python 執行

深度神經網絡:筆記(一)

的結果直接指派給變量variable_y ,而是寫成了一個方程。意味着當計算變量

深度神經網絡:筆記(一)

時,取

深度神經網絡:筆記(一)

在那個時間點的值,然後加上5。variable_y 值的計算在前面代碼中從未實際執行過。運作上述代碼,獲得一個變量存儲位址。

上述代碼屬于TensorFlow程式的計算圖建立部分。變量variable_y 沒有實際值10。

為了解決這個問題,必須執行計算圖的代碼部分

# initialize all variables
init = tf.global_variables_initializer()
# All variables are now initialized

with tf.Session() as sess:
     sess.run(init) 
           
  • tf.placeholder和feed_dict類型

tf.placeholder 是後續會在tf.session.run()函數中賦予值的變量。使用feed_dict參數值設定placeholder張量,通過這些占位符将資料輸入到計算圖中。

  • softmax

softmax函數将其輸入(logit或者logit score)轉換為0到1之間的值,并對輸出進行歸一化,使其總和為1。logit是指一個事件發生與不發生的機率比值的對數。softmax函數的定義為:

深度神經網絡:筆記(一)
  • 标簽

表示标簽通常稱為one-hot編碼。每個标簽都由一個向量表示,向量中1表示正确對應的标簽,0表示其他。當問題有數百萬個标簽時,one-hot編碼是無效的,因為向量中 大多數元素是0。用交叉熵測量兩個機率向量之間的相似距離。交叉熵是非對稱的。

  • 損失函數(成本函數、目标函數)

定義一個模型的好壞。用于确定模型損失的一個常見的函數叫作交叉熵損失。

在TensorFlow中,使用tf.reduce_sum()編寫一個交叉熵函數。輸入一個數字數組,并将其和作為一個張量傳回:

深度神經網絡:筆記(一)

3 深度神經網絡

第一層是輸入層,最後一層是輸出層,中間層是隐含層。如果隐含層不止一個,則這樣的網絡就是深度神經網絡。

隐含層中每個神經元的輸入和輸出都與下一層中每個神經元相連。每一層的神經元個數都是任意的。

隐含層和輸出層需要選擇激活函數。常用的激活函數為:sigmoid函數、雙曲正切函數和ReLU函數。

sigmoid函數,優勢在于

深度神經網絡:筆記(一)

點的導數就是簡單的

深度神經網絡:筆記(一)

乘以

深度神經網絡:筆記(一)
深度神經網絡:筆記(一)

有助于一種友善的方式計算神經網絡中的梯度。

ReLU函數:一個非線性函數,計算函數是

深度神經網絡:筆記(一)

,即輸入是負值,ReLu函數值為0,如果輸入

深度神經網絡:筆記(一)

,ReLu函數值為

深度神經網絡:筆記(一)

TensorFlow中,tf.nn.relu實作ReLU函數

深度神經網絡:筆記(一)

監督學習:對每個輸入樣本,檢查輸出,計算誤差率,然後調整權重,直到當輸入标簽為正确的圖像時,網絡輸出1,而其他輸出0。這種類型的訓練方法稱為監督學習。

調整權重的方法稱為反向傳播。反向傳播是誤差反向傳播的簡稱,與優化方法(如梯度下降)結合使用。反向傳播在計算梯度中的損失函數時,會考慮網絡中的所有權重,用梯度法更新權重,以優化損失函數。

4 Keras 深度學習庫

模型是Keras核心資料結構。序列模型由一個線性的層堆棧組成,通用函數fit()、evaluate()和compile()

包含全連接配接層、最大池化層和激活函數層。使用add()函數添加一個層。

第一層設定輸入次元後,第二層以第一層的輸出作為輸入,持續傳遞到下一層,直到最後一層,Keras将自動推斷出所有層的形狀。

5 反向傳播

反向傳播是一種使用鍊式法則計算梯度的方法。給定一個函數

深度神經網絡:筆記(一)

,其中

深度神經網絡:筆記(一)

是一個輸入向量,計算

深度神經網絡:筆記(一)

深度神經網絡:筆記(一)

點的梯度用

深度神經網絡:筆記(一)

表示。函數

深度神經網絡:筆記(一)

基本上是一個損失函數

深度神經網絡:筆記(一)

,輸入

深度神經網絡:筆記(一)

是權重和訓練資料的組合。

深度神經網絡:筆記(一)

通常計算參數的梯度更新參數

反向傳播包括

  • 做一個前饋運算
  • 将模型輸出與期望輸出進行比較
  • 計算誤差
  • 向後運作前饋運算(反向傳播),将誤差分散到每個權重
  • 更新權重,得到一個更好的模型
  • 持續上述步驟,直到得到一個滿意的模型

挑戰性問題:

  • 簡單添加任意數量的隐含層,反向傳播不能在資料集上使模型優化
  • 草率初始化權重,非線性函數會飽和停止學習,損失函數會趨于平緩,不會繼續下降,導緻梯度消失問題

前向/後向傳遞的鍊式法則

深度神經網絡:筆記(一)
深度神經網絡:筆記(一)

鍊式法則用于計算兩個或多個函數的複合函數的導數

繼續閱讀