用 Python 运行神经网络
一個神經網絡類
我們在神經網絡教程的前一章中學到了關于權重的最重要的事實。我們看到了它們的使用方式以及如何在 Python 中實現它們。我們看到,通過應用矩陣乘法,可以使用 Numpy 中的數組完成權重與輸入值的乘法。
然而,我們沒有做的是在真實的神經網絡環境中測試它們。我們必須先創造這個環境。我們現在將在 Python 中創建一個類,實現一個神經網絡。我們將分步進行,以便一切都易于理解。
我們班級需要的最基本的方法是:
- __init__?初始化一個類,即我們將設置每一層的神經元數量并初始化權重矩陣。
- run:一種應用于我們想要分類的樣本的方法。它將此樣本應用于神經網絡。我們可以說,我們“運行”網絡以“預測”結果。此方法在其他實現中通常稱為predict.
- train: 該方法獲取一個樣本和對應的目標值作為輸入。如有必要,它可以通過此輸入調整重量值。這意味著網絡從輸入中學習。從用戶的角度來看,我們“訓練”了網絡。在sklearn例如,這種方法被稱為fit
我們將把trainandrun方法的定義推遲到以后。權重矩陣應該在__init__方法內部初始化。我們是間接這樣做的。我們定義一個方法create_weight_matrices并在__init__.?這樣,init 方法就清晰了。
我們還將推遲向層添加偏置節點。
以下 Python 代碼包含應用我們在前一章中得出的知識的神經網絡類的實現:
導入 numpy的 是 NP 從 scipy.stats 導入 truncnormdef truncated_normal ( mean = 0 , sd = 1 , low = 0 , upp = 10 ): return truncnorm ( ( low - mean ) / sd , ( upp - mean ) / sd , loc = mean , scale = sd )類 神經網絡:def __init__ ( self , no_of_in_nodes , no_of_out_nodes , no_of_hidden_??nodes , learning_rate ): self 。no_of_in_nodes = no_of_in_nodes self 。no_of_out_nodes = no_of_out_nodes self 。no_of_hidden_??nodes = no_of_hidden_??nodes self 。learning_rate = learning_rate self . create_weight_matrices ()def create_weight_matrices ( self ): rad = 1 / np 。SQRT (自我。no_of_in_nodes )X = truncated_normal (平均值= 0 , SD = 1 , 低= -弧度, UPP =弧度)自我。weights_in_hidden = X 。RVS ((自我。no_of_hidden_??nodes , 自我。no_of_in_nodes )) rad = 1 / np 。SQRT (自我。no_of_hidden_??nodes )X = truncated_normal (平均值= 0 , SD = 1 , 低= -弧度, UPP =弧度)自我。weights_hidden_??out = X 。RVS ((自我。no_of_out_nodes , 自我。no_of_hidden_??nodes ))def train ( self ):通過def run ( self ):通過我們不能用這段代碼做很多事情,但我們至少可以初始化它。我們也可以看看權重矩陣:
simple_network = NeuralNetwork (no_of_in_nodes = 3 , no_of_out_nodes = 2 , no_of_hidden_??nodes = 4 ,learning_rate = 0.1 ) 打印(simple_network 。weights_in_hidden ) 打印(simple_network 。weights_hidden_??out )輸出:
[[-0.38364195 0.22655694 0.08684721][ 0.2767437 0.28723294 -0.27309445][ 0.25638328 -0.34340133 -0.37399997][-0.1468639 0.54354951 0.08970088]] [[ 0.34758695 0.41193854 -0.02512014 0.4407185 ][ 0.21963126 0.37803538 0.40223143 0.13695252]]激活函數、Sigmoid 和 ReLU
在我們對run方法進行編程之前,我們必須處理激活函數。我們在神經網絡的介紹章節中有下圖:
感知器的輸入值由求和函數處理,然后是激活函數,將求和函數的輸出轉換為所需的更合適的輸出。求和函數意味著我們將有一個權重向量和輸入值的矩陣乘法。
神經網絡中使用了許多不同的激活函數。可以在 Wikipedia 上找到對可能的激活函數的最全面的概述之一。
sigmoid 函數是常用的激活函數之一。我們使用的 sigmoid 函數也稱為 Logistic 函數。
它被定義為
σ(X)=11+電子-X
讓我們看一下 sigmoid 函數的圖形。我們使用 matplotlib 繪制 sigmoid 函數:
import numpy as np import matplotlib.pyplot as plt def sigma ( x ): return 1 / ( 1 + np . exp ( - x ))X = np 。linspace ( - 5 , 5 , 100 )PLT 。繪圖( X , sigma ( X ), 'b' ) plt 。xlabel ( 'X 軸' ) plt 。ylabel ( 'Y 軸' ) plt 。標題('Sigmoid 函數' )PLT 。網格()PLT 。文本( 2.3 , 0.84 , r '$\sigma(x)=\frac {1} {1+e^{-x}}$' , fontsize = 16 )PLT 。顯示()查看圖表,我們可以看到 sigmoid 函數將給定的數字映射x到 0 到 1 之間的數字范圍內。不包括 0 和 1!隨著 的值x變大,sigmoid 函數的值越來越接近 1,隨著xsigmoid 函數的值越來越小,sigmoid 函數的值越來越接近 0。
除了我們自己定義 sigmoid 函數之外,我們還可以使用來自 的 expit 函數scipy.special,它是 sigmoid 函數的一個實現。它可以應用于各種數據類,如 int、float、list、numpy、ndarray 等。結果是一個與輸入數據 x 形狀相同的 ndarray。
從 scipy.special 進口 expit 打印(expit (3.4 )) 打印(expit ([ 3 , 4 , 1 )) 打印(expit (NP 。陣列([ 0.8 , 2.3 , 8 ])))輸出:
0.9677045353015494 [0.95257413 0.98201379 0.73105858] [0.68997448 0.90887704 0.99966465]在神經網絡中經常使用邏輯函數來在模型中引入非線性并將信號映射到指定的范圍,即 0 和 1。它也很受歡迎,因為在反向傳播中需要的導數很簡單。
σ(X)=11+電子-X
及其衍生物:
σ′(X)=σ(X)(1-σ(X))
import numpy as np import matplotlib.pyplot as plt def sigma ( x ): return 1 / ( 1 + np . exp ( - x ))X = np 。linspace ( - 5 , 5 , 100 )PLT 。繪圖(X , 西格瑪(X )) plt 。繪圖( X , sigma ( X ) * ( 1 - sigma ( X )))PLT 。xlabel ( 'X 軸' ) plt 。ylabel ( 'Y 軸' ) plt 。標題('Sigmoid 函數' )PLT 。網格()PLT 。文本( 2.3 , 0.84 , r '$\sigma(x)=\frac {1} {1+e^{-x}}$' , fontsize = 16 ) plt 。文本( 0.3 , 0.1 , r '$\sigma \' (x) = \sigma(x)(1 - \sigma(x))$' , fontsize = 16 )PLT 。顯示()我們還可以使用來自 numpy 的裝飾器 vectorize 定義我們自己的 sigmoid 函數:
@np 。矢量化 DEF 乙狀結腸(X ):返回 1 / (1 + NP 。? ** - X )#sigmoid = np.vectorize(sigmoid) sigmoid ([ 3 , 4 , 5 ])輸出:
數組([0.95257413,0.98201379,0.99330715])另一個易于使用的激活函數是 ReLU 函數。ReLU 代表整流線性單元。它也稱為斜坡函數。它被定義為其論點的積極部分,即是=最大限度(0,X).?這是“目前,最成功和最廣泛使用的激活函數是整流線性單元 (ReLU)”?1?ReLu 函數在計算上比 Sigmoid 類函數更高效,因為 Relu 意味著只選擇 0 和參數 之間的最大值x。而 Sigmoids 需要執行昂貴的指數運算。
# 替代激活函數 def ReLU ( x ): return np . 最大值( 0.0 , x )# relu 的推導 def ReLU_derivation ( x ): if x <= 0 : return 0 else : return 1 導入 numpy 作為 np 導入 matplotlib.pyplot 作為 pltX = np 。linspace (- 5 , 6 , 100 ) PLT 。繪圖( X , ReLU ( X ), 'b' ) plt 。xlabel ( 'X 軸' ) plt 。ylabel ( 'Y 軸' ) plt 。標題('ReLU 函數' ) plt 。網格() plt 。文本( 0.8 , 0.4 , r '$ReLU(x)=max(0, x)$' , fontsize = 14 ) plt 。顯示()添加運行方法
我們現在擁有一切來實現我們的神經網絡類的run(或predict)方法。我們將scipy.special用作激活函數并將其重命名為activation_function:
from scipy.special import expit as activation_function我們在該run方法中要做的所有事情包括以下內容。
我們可以實例化這個類的一個實例,這將是一個神經網絡。在以下示例中,我們創建了一個具有兩個輸入節點、四個隱藏節點和兩個輸出節點的網絡。
simple_network = NeuralNetwork (no_of_in_nodes = 2 , no_of_out_nodes = 2 , no_of_hidden_??nodes = 4 ,learning_rate = 0.6 )我們可以將 run 方法應用于所有形狀為 (2,) 的數組,以及具有兩個數字元素的列表和元組。調用的結果由權重的隨機值定義:
simple_network 。運行([( 3 , 4 )])輸出:
數組([[0.62128186],[0.58719777]])腳注
1拉馬錢德蘭,普拉吉特;巴雷特,佐夫;Quoc, V. Le(2017 年 10 月 16 日)。
總結
以上是生活随笔為你收集整理的用 Python 运行神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地下水深度去除铁锰的滤料详解
- 下一篇: 盐湖提锂卤水除钙镁,高盐软化工艺有哪些?