當前位置:成語大全網 - 新華字典 - Keras快速構建神經網絡模型

Keras快速構建神經網絡模型

用Keras搭建神經網絡的步驟:

深度學習框架Keras——像搭積木般構建神經網絡,主要分為7個部分,每個部分只需要幾個keras API函數就能實現,用戶即可像搭積木般壹層層構建神經網絡模型。

1. 創建模型 Create model

2. 添加層級 Add Layer

3. 模型編譯 Compile

4. 數據填充 Fit

5. 模型評估 Evaluate

6. 模型預測 Predict

7. 模型保存 Save model

下面章節會對每壹部分具體來介紹。。。

Keras 中主要有三類模型:Sequential model, Functional model, Subclass model

在開始創建模型之前,首先需要引入tensorflow和keras模塊,然後再創建壹個Sequential model

Sequential API定義如下:

layers參數可以為空, 然後通過add method向模型中添加layer,相對應的通過pop method移除模型中layer。

創建Function API模型,可以調用Keras.Model來指定多輸入多數出。

Keras.Model定義:

Layers是神經網絡基本構建塊。壹個Layer包含了tensor-in/tensor-out的計算方法和壹些狀態,並保存在TensorFlow變量中(即layers的權重weights)。

Layers主要分為6個類別,基礎層,核心層,卷基層,池化層,循環層,融合層。

對派生類的實現可以用以下方法:

** init (): 定義layer的屬性,創建layer的靜態變量。

** build(self, input_shape): 創建依賴於輸入的變量,可以調用add_weight()。

** call(self, *args, **kwargs): 在確保已調用build()之後,在 call 中調用。

** get_config(self): 返回包含用於初始化此層的配置的字典類型。

創建SimpleDense派生類,在build()函數裏添加trainable weights。實現y=input*w +b

結果輸出:

創建ComputeSum派生類,在 init 函數裏添加 non-trainable weights。實現輸入矩陣沿軸0元素相加後,x=x+self.total

結果輸出:

核心層是最常用的層,涉及到數據的轉換和處理的時候都會用到這些層。

Dense層就是所謂的全連接神經網絡層,簡稱全連接層。全連接層中的每個神經元與其前壹層的所有神經元進行全連接。

Dense 實現以下操作: output = activation(dot(input, kernel) + bias) 其中 activation 是按逐個元素計算的激活函數,kernel 是由網絡層創建的權值矩陣,以及 bias 是其創建的偏置向量 (只在 use_bias 為 True 時才有用)。

將激活函數應用於輸出。輸入信號進入神經元後進行的運算處理。

sigmoid、tanh、ReLU、softplus的對比曲線如下圖所示:

激活函數可以通過設置單獨的激活層Activation實現,也可以在構造層對象時通過傳遞 activation 參數實現:

Dropout在訓練中每次更新時,將輸入單元的按比率隨機設置為0,這有助於防止過擬合。未設置為0的輸入將按1 /(1-rate)放大,以使所有輸入的總和不變。

請註意,僅當訓練設置為True時才應用Dropout層,以便在推理過程中不會丟棄任何值。 使用model.fit時,訓練將自動適當地設置為True。

將輸入展平。不影響批量大小。註意:如果輸入的形狀是(batch,)沒有特征軸,則展平會增加通道尺寸,而輸出的形狀是(batch, 1)。

將輸入重新調整為特定的尺寸

將任意表達式封裝為Layer對象。在Lambda層,以便在構造模型時可以使用任意TensorFlow函數。 Lambda層最適合簡單操作或快速實驗。 Lambda層是通過序列化Python字節碼來保存的。

使用覆蓋值覆蓋序列,以跳過時間步。

對於輸入張量的每壹個時間步(張量的第壹個維度),如果所有時間步中輸入張量的值與mask_value相等,則將在所有下遊層中屏蔽(跳過)該時間步。如果任何下遊層不支持覆蓋但仍然收到此類輸入覆蓋信息,會引發異常。

舉例說明:

Embedding 是壹個將離散變量轉為連續向量表示的壹個方式。該層只能用作模型中的第壹層。

Embedding 有以下3個主要目的: 在 embedding 空間中查找最近鄰,這可以很好的用於根據用戶的興趣來進行推薦。 作為監督性學習任務的輸入。 用於可視化不同離散變量之間的關系.

舉例說明:

輸出結果:

由維基百科的介紹我們可以得知,卷積是壹種定義在兩個函數(?跟?)上的數學操作,旨在產生壹個新的函數。那麽?和?的卷積就可以寫成,數學定義如下:

對應到不同方面,卷積可以有不同的解釋:? 既可以看作我們在深度學習裏常說的核(Kernel),也可以對應到信號處理中的濾波器(Filter)。而 ? 可以是我們所說的機器學習中的特征(Feature),也可以是信號處理中的信號(Signal)。f和g的卷積 ()就可以看作是對?的加權求和。

壹維時域卷積操作:

二維圖像卷積操作:

卷積運算的目的是提取輸入的不同特征,第壹層卷積層可能只能提取壹些低級的特征如邊緣、線條和角等層級,更多層的網路能從低級特征中叠代提取更復雜的特征。

壹維卷積層(即時域卷積),用以在壹維輸入信號上進行鄰域濾波。

舉例說明:

結果輸出:

2D 卷積層 (例如對圖像的空間卷積)。

舉例說明:

結果輸出:

3D卷積層(例如體積上的空間卷積)

舉例說明:

結果輸出:

深度可分離1D卷積。該層執行分別作用在通道上的深度卷積,然後是混合通道的逐點卷積。 如果use_bias為True並提供了壹個偏差初始值設定項,則它將偏差向量添加到輸出中。 然後,它可選地應用激活函數以產生最終輸出。

深度可分離的2D卷積。可分離的卷積包括首先執行深度空間卷積(它分別作用於每個輸入通道),然後是點向卷積,它將混合所得的輸出通道。 depth_multiplier參數控制在深度步驟中每個輸入通道生成多少個輸出通道。

直觀上,可分離的卷積可以理解為將卷積內核分解為兩個較小內核的壹種方式,或者是Inception塊的壹種極端版本。

轉置卷積層 (有時被成為反卷積)。對轉置卷積的需求壹般來自希望使用 與正常卷積相反方向的變換,將具有卷積輸出尺寸的東西 轉換為具有卷積輸入尺寸的東西, 同時保持與所述卷積相容的連通性模式。

池化層是模仿人的視覺系統對數據進行降維,用更高層次的特征表示圖像。實施池化的目的:降低信息冗余;提升模型的尺度不變性、旋轉不變性。 防止過擬合。

通常有最大池化層,平均池化層。

池化層有三種形態:1D 用於壹維數據,2D 壹般用於二維圖像數據,3D 帶時間序列數據的圖像數據

循環神經網絡(Recurrent Neural Network, 簡稱 RNN),循環神經網絡的提出便是基於記憶模型的想法,期望網絡能夠記住前面出現的特征,並依據特征推斷後面的結果,而且整體的網絡結構不斷循環,因此得名為循環神經網絡。

長短期記憶網絡(Long-Short Term Memory, LSTM )論文首次發表於1997年。由於獨特的設計結構,LSTM適合於處理和預測時間序列中間隔和延遲非常長的重要事件。

舉例說明:

結果輸出:

GRU 門控循環單元- Cho et al. 2014.

在LSTM中引入了三個門函數:輸入門、遺忘門和輸出門來控制輸入值、記憶值和輸出值。而在GRU模型中只有兩個門:分別是更新門和重置門。與LSTM相比,GRU內部少了壹個”門控“,參數比LSTM少,但是卻也能夠達到與LSTM相當的功能。考慮到硬件的計算能力和時間成本,因而很多時候我們也就會選擇更加”實用“的GRU。

舉例說明:

結果輸出:

循環神經網絡層基類。

關於指定 RNN 初始狀態的說明

您可以通過使用關鍵字參數 initial_state 調用它們來符號化地指定 RNN 層的初始狀態。 initial_state 的值應該是表示 RNN 層初始狀態的張量或張量列表。

可以通過調用帶有關鍵字參數 states 的 reset_states 方法來數字化地指定 RNN 層的初始狀態。 states 的值應該是壹個代表 RNN 層初始狀態的 Numpy 數組或者 Numpy 數組列表。

關於給 RNN 傳遞外部常量的說明

可以使用 RNN. call (以及 RNN.call)的 constants 關鍵字參數將「外部」常量傳遞給單元。 這要求 cell.call 方法接受相同的關鍵字參數 constants。 這些常數可用於調節附加靜態輸入(不隨時間變化)上的單元轉換,也可用於註意力機制。

舉例說明:

在訓練模型之前,我們需要配置學習過程,這是通過compile方法完成的。

他接收三個參數:優化器 opt