基於Python建立深度神經網絡!你學會了嘛?

2021-03-02 Python學習交流

圖1 神經網絡構造的例子(符號說明:上標[l]表示與第l層;上標(i)表示第i個例子;下標i表示矢量第i項)

單層神經網絡

圖2 單層神經網絡示例

神經元模型是先計算一個線性函數(z=Wx+b),接著再計算一個激活函數。一般來說,神經元模型的輸出值是a=g(Wx+b),其中g是激活函數(sigmoid,tanh, ReLU, …)。

數據集

假設有一個很大的資料庫,裡面記錄了很多天氣數據,例如,氣溫、溼度、氣壓和降雨率。

問題陳述:

一組訓練數據m_train,下雨標記為(1),不下雨標記為(0)。

一個測試數據組m_test,標記是否下雨。

每一個天氣數據包含x1=氣溫,x2=溼度,x3=氣壓。

機器學習中一個常見的預處理步驟是將數據集居中並標準化,這意味著從每個示例中減去整個numpy數組的平均值,然後將每個示例除以整個numpy數組的標準偏差。

通用方法(建立部分算法)

使用深度學習來建造模型

1. 定義模型構造(例如,數據的輸入特徵)

2. 初始化參數並定義超參數

迭代次數

在神經網絡中的L層的層數

隱藏層大小

學習率α

3. 迭代循環

正向傳播(計算電流損耗)

計算成本函數

反向傳播(計算電流損耗)

升級參數(使用背景參數和梯度)

4. 使用訓練參數來預測標籤

初始化

更深層次的L-層神經網絡的初始化更為複雜,因為有更多的權重矩陣和偏置向量。下表展示了不同結構的各種層級。

表1 L層的權重矩陣w、偏置向量b和激活函數z

表2 示例架構中的神經網絡權重矩陣w、偏置向量b和激活函數z

表2幫助我們為圖1中的示例神經網絡架構的矩陣準備了正確的維度。

import numpy as np
import matplotlib.pyplot as plt
nn_architecture = [
{"layer_size": 4,"activation": "none"}, # input layer
{"layer_size": 5,"activation": "relu"},
{"layer_size": 4,"activation": "relu"},
{"layer_size": 3,"activation": "relu"},
{"layer_size": 1,"activation": "sigmoid"}
]
def initialize_parameters(nn_architecture, seed = 3):
np.random.seed(seed)
# python dictionary containingour parameters "W1", "b1", ..., "WL","bL"
parameters = {}
number_of_layers = len(nn_architecture)
for l in range(1,number_of_layers):
parameters['W' + str(l)] =np.random.randn(
nn_architecture[l]["layer_size"],
nn_architecture[l-1]["layer_size"]
) * 0.01
parameters['b' + str(l)] =np.zeros((nn_architecture[l]["layer_size"], 1))
return parameters

代碼段1 參數初始化

使用小隨機數初始化參數是一種簡單的方法,但同時也保證算法的起始值足夠好。

記住:

· 不同的初始化工具,例如Zero,Random, He or Xavier,都會導致不同的結果。

· 隨機初始化能夠確保不同的隱藏單元可以學習不同的東西(初始化所有權重為零會導致,所有層次的所有感知機都將學習相同的東西)。

· 不要初始化為太大的值。

激活函數

激活函數的作用是為了增加神經網絡的非線性。下例將使用sigmoid and ReLU。

Sigmoid輸出一個介於0和1之間的值,這使得它成為二進位分類的一個很好的選擇。如果輸出小於0.5,可以將其分類為0;如果輸出大於0.5,可以將其分類為1。

def sigmoid(Z):
S = 1 / (1 + np.exp(-Z))
return S
def relu(Z):
R = np.maximum(0, Z)
return R
def sigmoid_backward(dA, Z):
S = sigmoid(Z)
dS = S * (1 - S)
return dA * dS
def relu_backward(dA, Z):
dZ = np.array(dA, copy = True)
dZ[Z <= 0] = 0
return dZ

代碼段2 Sigmoid和ReLU激活函數,及其衍生物

在代碼段2中,可以看到激活函數及其派生的矢量化編程實現。該代碼將用於進一步的計算。

正向傳播

在正向傳播中,在層l的正向函數中,需要知道該層中的激活函數是哪一種(sigmoid、tanh、ReLU等)。前一層的輸出值為這一層的輸入值,先計算z,再用選定的激活函數計算。

圖3 神經網絡的正向傳播

線性正向模塊(對所有示例進行矢量化)計算以下方程式:

方程式1 線性正向函數

def L_model_forward(X, parameters, nn_architecture):
forward_cache = {}
A = X
number_of_layers =len(nn_architecture)
for l in range(1,number_of_layers):
A_prev = A
W = parameters['W' + str(l)]
b = parameters['b' + str(l)]
activation =nn_architecture[l]["activation"]
Z, A =linear_activation_forward(A_prev, W, b, activation)
forward_cache['Z' + str(l)] =Z
forward_cache['A' + str(l)] =A
AL = A
return AL, forward_cache
def linear_activation_forward(A_prev, W, b, activation):
if activation =="sigmoid":
Z = linear_forward(A_prev, W,b)
A = sigmoid(Z)
elif activation =="relu":
Z = linear_forward(A_prev, W,b)
A = relu(Z)
return Z, A
def linear_forward(A, W, b):
Z = np.dot(W, A) + b
return Z

代碼段3 正向傳播模型

使用「cache」(python字典包含為特定層所計算的a和z值)以在正向傳播至相應的反向傳播期間傳遞變量。它包含用於反向傳播計算導數的有用值。

損失函數

為了管程學習過程,需要計算代價函數的值。下面的公式用於計算成本。

方程式2 交叉熵成本

def compute_cost(AL, Y):
m = Y.shape[1]
# Compute loss from AL and y
logprobs =np.multiply(np.log(AL),Y) + np.multiply(1 - Y, np.log(1 - AL))
# cross-entropy cost
cost = - np.sum(logprobs) / m
cost = np.squeeze(cost)
return cost

代碼段4 代價函數的計算

反向傳播

反向傳播用於計算參數的損失函數梯度。該算法是由微分學中已知的「鏈規則」遞歸使用的。

反向傳播計算中使用的公式:

方程式3 反向傳播計算公式

鏈式法則是計算複合函數導數的公式。複合函數就是函數套函數。

方程式4 鏈規則示例

「鏈規則」在計算損失時十分重要(以方程式5為例)。

方程式5 損失函數(含替換數據)及其相對於第一權重的導數

神經網絡模型反向傳播的第一步是計算最後一層損失函數相對於z的導數。方程式6由兩部分組成:方程式2損失函數的導數(關於激活函數)和激活函數「sigmoid」關於最後一層Z的導數。

方程式6 從4層對z的損失函數導數

方程式6的結果可用於計算方程式3的導數。

方程式7 損失函數相對於3層的導數

在進一步計算中,使用了與第三層激活函數有關的損失函數的導數(方程式7)。

方程式8 第三層的導數

方程式7的結果和第三層活化函數「relu」的導數用於計算方程式8的導數(損失函數相對於z的導數)。然後,我們對方程式3進行了計算。

我們對方程9和10做了類似的計算。

方程式9 第二層的導數

方程式10 第一層的導數

總體思路

從第一層層對z的損失函數導數有助於計算(L-1)層(上一層)對損失函數的導數。結果將用於計算激活函數的導數。

圖4 神經網絡的反向傳播

def L_model_backward(AL, Y, parameters, forward_cache, nn_architecture):
grads = {}
number_of_layers =len(nn_architecture)
m = AL.shape[1]
Y = Y.reshape(AL.shape) # afterthis line, Y is the same shape as AL
# Initializing thebackpropagation
dAL = - (np.divide(Y, AL) -np.divide(1 - Y, 1 - AL))
dA_prev = dAL
for l in reversed(range(1,number_of_layers)):
dA_curr = dA_prev
activation =nn_architecture[l]["activation"]
W_curr = parameters['W' +str(l)]
Z_curr = forward_cache['Z' +str(l)]
A_prev = forward_cache['A' +str(l-1)]
dA_prev, dW_curr, db_curr =linear_activation_backward(dA_curr, Z_curr, A_prev, W_curr, activation)
grads["dW" +str(l)] = dW_curr
grads["db" +str(l)] = db_curr
return grads
def linear_activation_backward(dA, Z, A_prev, W, activation):
if activation =="relu":
dZ = relu_backward(dA, Z)
dA_prev, dW, db =linear_backward(dZ, A_prev, W)
elif activation =="sigmoid":
dZ = sigmoid_backward(dA, Z)
dA_prev, dW, db =linear_backward(dZ, A_prev, W)
return dA_prev, dW, db
def linear_backward(dZ, A_prev, W):
m = A_prev.shape[1]
dW = np.dot(dZ, A_prev.T) / m
db = np.sum(dZ, axis=1,keepdims=True) / m
dA_prev = np.dot(W.T, dZ)
return dA_prev, dpython編寫知乎爬蟲實踐W, db

代碼段5 反向傳播模塊

更新參數

該函數的目標是通過梯度優化來更新模型的參數。

def update_parameters(parameters, grads, learning_rate):
L = len(parameters)
for l in range(1, L):
parameters["W" +str(l)] = parameters["W" + str(l)] - learning_rate *grads["dW" + str(l)]
parameters["b" +str(l)] = parameters["b" + str(l)] - learning_rate *grads["db" + str(l)]
return parameters

代碼段6 使用梯度下降更新參數值

全模型

神經網絡模型的完整實現包括在片段中提供的方法。

def L_layer_model(X, Y, nn_architecture, learning_rate = 0.0075,num_iterations = 3000, print_cost=False):
np.random.seed(1)
# keep track of cost
costs = []
# Parameters initialization.
parameters =initialize_parameters(nn_architecture)
# Loop (gradient descent)
for i in range(0,num_iterations):
# Forward propagation:[LINEAR -> RELU]*(L-1) -> LINEAR -> SIGMOID.
AL, forward_cache =L_model_forward(X, parameters, nn_architecture)
# Compute cost.
cost = compute_cost(AL, Y)
# Backward propagation.
grads = L_model_backward(AL,Y, parameters, forward_cache, nn_architecture)
# Update parameters.
parameters =update_parameters(parameters, grads, learning_rate)
# Print the cost every 100training example
if print_cost and i % 100 ==0:
print("Cost afteriteration %i: %f" %(i, cost))
costs.append(cost)
# plot the cost
plt.plot(np.squeeze(costs))
plt.ylabel('cost')
plt.xlabel('iterations (pertens)')
plt.title("Learning rate=" + str(learning_rate))
plt.show()
return parameters

代碼段7 整個神經網絡模型

只需要將已知的權重和系列測試數據,應用於正向傳播模型,就能預測結果。

可以修改snippet1中的nn_架構,以構建具有不同層數和隱藏層大小的神經網絡。此外,準備正確實現激活函數及其派生函數(代碼段2)。所實現的函數可用於修改代碼段3中的線性正向激活方法和代碼段5中的線性反向激活方法。

進一步改進

如果訓練數據集不夠大,則可能面臨「過度擬合」問題。這意味著所學的網絡不會概括為它從未見過的新例子。可以使用正則化方法,如L2規範化(它包括適當地修改成本函數)或退出(它在每次迭代中隨機關閉一些感知機)。

我們使用梯度下降來更新參數和最小化成本。你可以學習更多高級優化方法,這些方法可以加快學習速度,甚至可以為成本函數提供更好的最終價值,例如:

· 小批量梯度下降

· 動力

· Adam優化器

相關焦點

  • 神經網絡初學者指南:基於Scikit-Learn的Python模塊
    ,其最新版本現在已經內置支持神經網絡模型。| 神經網絡神經網絡是一個試圖模仿自然生物神經網絡的學習模式的機器學習框架。 生物神經網絡具有相互連接的神經元,神經元帶有接受輸入信號的樹突,然後基於這些輸入,它們通過軸突向另一個神經元產生輸出信號。 我們將嘗試通過使用人工神經網絡(ANN)來模擬這個過程,我們現在將其稱為神經網絡。
  • 基於深度神經網絡的脫硫系統預測模型及應用
    本文還結合某 2×350MW 燃煤電廠提供的實際工數據,以石灰石供漿密度對系統脫硫性能的影響為例,詳細介紹了利用所建立的深度神經網絡模型測試溼法脫硫系統各參數指標對脫硫效果的影響,並結合化學機理和工業實際進行的診斷過程。
  • 基於深度神經網絡構建風電機組性能模型的超參數選擇
    風電機組性能評估依賴於建立風電機組性能模型,即建立風電機組輸出功率與風電機組各關鍵參數( 如風速、槳距角、偏航角等) 之間的函數關係,這屬於典型的非線性回歸問題;在機器學習領域,深度神經網絡是解決該問題的經典手段,因此,利用其構建風電機組性能模型自然得到了行業內研究者的廣泛嘗試。
  • 無需深度學習框架,如何從零開始用Python構建神經網絡
    作者根據自己從零開始學習用 Python 構建神經網絡的經驗,編寫了一份攻略。內容涵蓋神經網絡定義、損失函數、前向傳播、反向傳播、梯度下降算法,對於想要了解深度學習運作原理的各位來說,內容精彩不可錯過。動機:為了深入了解深度學習,我決定從零開始構建神經網絡,並且不使用類似 Tensorflow 的深度學習庫。
  • python深度學習---帶你從入門到精通
    為輔助提高廣大科研工作者的使用python深度學習技術,我們舉辦了本次《python深度學習實踐技術及應用線上培訓》,利用大量的案例講解與實操練習讓大家更深入便捷的運用到工作學習中,也方便各個領域可以更好地交叉融合、擴展應用。
  • 神經網絡與深度學習
    其中有一種很厲害的模型,那就是人工神經網絡。這種模型從早期的感知機發展而來,對任何函數都有較好的擬合性,但自上個世紀90年代一直到2012年深度學習集中爆發前夕,神經網絡受制於計算資源的限制和較差的可解釋性,一直處於發展的低谷階段。
  • 分享《深度學習入門:基於Python的理論與實現》高清中文版PDF+原始碼
    《深度學習入門:基於Python的理論與實現》本書是深度學習真正意義上的入門書,深入淺出地剖析了深度學習的原理和相關技術。書中使用Python3,儘量不依賴外部庫或工具,從基本的數學知識出發,帶領讀者從零創建一個經典的深度學習網絡,使讀者在此過程中逐步理解深度學習。
  • 人工智慧黑盒揭秘:深度神經網絡可視化技術
    雲腦科技自主研發的 Deepro 深度學習平臺利用可視化技術,集成了最前沿的各類深度神經網絡可視化組件,分析與顯化內部隱藏結構與模型輸出的關係,解決「黑盒」難題。深度神經網絡又是最為複雜的機器學習模型,其可解釋性與可視化性更加具有挑戰性。網絡模型為什麼起作用,它是否足夠好,圖像識別是如何抽象出「貓」這個概念的?本段分析了幾種典型深度神經網絡可視化技術,詳盡展示了前沿的可視化原理以及解釋性效果。
  • 如何用Python和深度神經網絡識別圖像?
    請到你的「終端」(Linux, macOS)或者「命令提示符」(Windows)下面,進入咱們剛剛下載解壓後的樣例目錄。執行以下命令,我們來創建一個Anaconda虛擬環境,名字叫做turi。conda create -n turi python=2.7 anaconda然後,我們激活turi虛擬環境。
  • 吳恩達深度學習課程:神經網絡和深度學習[中英文字幕+ppt課件]
    此課程廣受好評,通過視頻講解、作業與測驗等讓更多的人對人工智慧有了了解與啟蒙,國外媒體報導稱:吳恩達這次深度學習課程是迄今為止,最全面、系統和容易獲取的深度學習課程,堪稱普通人的人工智慧第一課。第一周  深度學習概論:學習驅動神經網絡興起的主要技術趨勢,了解現今深度學習在哪裡應用、如何應用。
  • 為什麼深度神經網絡這麼難訓練?
    如果進行視覺模式識別,那麼第1層的神經元可能學會識別邊;第2層的神經元可以在此基礎上學會識別更加複雜的形狀,例如三角形或矩形;第3層將能夠識別更加複雜的形狀,以此類推。有了這些多層抽象,深度神經網絡似乎可以學習解決複雜的模式識別問題。正如電路示例所體現的那樣,理論研究表明深度神經網絡本質上比淺層神經網絡更強大。 如何訓練深度神經網絡呢?
  • 深度神經網絡機器翻譯
    今天有時間和大家一起討論下下, 深度神經網絡機器翻譯。前言2016年年底, Google公布了神經網絡機器翻譯(GNMT), 從此宣告, 機器翻譯經過27年左右, 正式從1989年的IBM機器翻譯模型(PBMT,基於短語的機器翻譯),過渡到了神經網絡機器翻譯模型。已經極大接近了普通人的翻譯了。
  • 深度學習預測比特幣價格;基於神經網絡的自動化前端開發 | Github...
    如果你對自己的 AI 項目有足夠的自信,同時也希望更多的開發者參與到你的項目中,歡迎將項目的 Github 連結發給雷鋒網(公眾號:雷鋒網) AI 研習社,說不定下一期推薦的就是你的項目。用深度學習預測虛擬貨幣價格 —— ethereum_future
  • 為什麼深度神經網絡這麼難訓練?|贈書
    而且,憑直覺來看,擁有更多隱藏層的神經網絡會更強大,如圖5-4所示。這樣的神經網絡可以使用中間層構建出多層抽象,正如在布爾電路中所做的那樣。如果進行視覺模式識別,那麼第1層的神經元可能學會識別邊;第2層的神經元可以在此基礎上學會識別更加複雜的形狀,例如三角形或矩形;第3層將能夠識別更加複雜的形狀,以此類推。
  • 深度學習筆記4:深度神經網絡的正則化
    作者:魯偉 一個數據科學踐行者的學習日記。
  • 基於TensorFlow的深度學習實戰
    毫不誇張得說,TensorFlow的流行讓深度學習門檻變得越來越低,只要你有Python和機器學習基礎,入門和使用神經網絡模型變得非常簡單。TensorFlow簡介如前所述,TensorFlow是一個深度學習庫,使用這一框架,可以用來構建和測試深度神經網絡。深度學習讓我們能夠以極高的準確性構建複雜的應用程式。
  • 火爆網絡的《神經網絡與深度學習》,有人把它翻譯成了中文版!
    ,就是《Neural Network and Deep Learning》,中文譯為《神經網絡與深度學習》。這是我個人以為目前最好的神經網絡與機器學習入門資料之一。內容非常淺顯易懂,很多數學密集的區域作者都有提示。全書貫穿的是 MNIST 手寫數字的識別問題,每個模型和改進都有詳細注釋的代碼。非常適合用來入門神經網絡和深度學習!
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    基於liunx系統的python教程,課程裡也有liunx操作的詳細教學,不用擔心學習時不會操作liunx系統。 25python網絡爬蟲 26機器學習入門篇 27機器學習入門篇2 28機器學習提升篇 29數據挖掘篇 30深度學習必備原理與實戰 31深度學習必備原理與實戰2 32深度學習必備原理與實戰3 33深度學習必備原理與實戰4 34深度學習項目實戰 35
  • 基於光照感知深度神經網絡的多光譜數據融合行人檢測
    給出一對對齊的可見光和熱圖像,雙流深度神經網絡(TDNN)生成多光譜語義特徵圖。白天-光照子網絡和夜間-光照子網絡利用多光譜語義特徵圖在不同光照條件下進行行人檢測和語義分割。最終的檢測結果是由多個光照感知子網絡的輸出融合而成。在本文工作中,我們設計了一個框架,通過提出的光照感知深度神經網絡來學習在不同光照條件下(白天和夜間)的多光譜人體相關特徵。
  • 普通視頻轉高清:10個基於深度學習的超解析度神經網絡
    我們還可以利用深度學習來做超解析度。我們這次就分享一下用於超解析度的深度學習基本框架,以及衍生出的各種網絡模型,其中有些網絡在滿足實時性方面也有不錯的表現。機器學習與深度學習對於接觸機器學習與深度學習較少的開發者,可能會搞不清兩者的差別,甚至認為機器學習就是深度學習。其實,我們用一張圖可以簡單區分這個概念。