使用Keras進行深度學習:(一)Keras 入門

Keras是Python中以CNTK、Tensorflow或者Theano為計算後臺的一個深度學習建模環境。相對於其他深度學習的框架,如Tensorflow、Theano、Caffe等,Keras在實際應用中有一些顯著的優點,其中最主要的優點就是Keras已經高度模塊化了,支持現有的常見模型(CNN、RNN等),更重要的是建模過程相當方便快速,加快了開發速度。


筆者使用的是基於Tensorflow為計算後臺。接下來將介紹一些建模過程的常用層、搭建模型和訓練過程,而Keras中的文字、序列和圖像數據預處理,我們將在相應的實踐項目中進行講解。 各層函數只介紹一些比較常用參數,詳細參數介紹可查閱Keras文檔 。

1 核心層

(1)全連接層:神經網絡中最常用到的,實現對神經網絡裡的神經元激活。

Dense(units, activation=’relu’, use_bias=True)

參數說明:

units: 全連接層輸出的維度,即下一層神經元的個數activation:激活函數,默認使用Reluuse_bias:是否使用bias偏置項

(2)激活層:對上一層的輸出應用激活函數。

Activation(activation)

參數說明:

Activation:想要使用的激活函數,如:relu、tanh、sigmoid等

(3) Dropout層:對上一層的神經元隨機選取一定比例的失活,不更新,但是權重仍然保留, 防止過擬合。

Dropout(rate)

參數說明:

rate:失活的比例,0-1的浮點數。

(4)Flatten層:將一個維度大於或等於3的高維矩陣,“壓扁”為一個二維矩陣。即保留第一個維度(如:batch的個數),然後將剩下維度的值相乘為“壓扁”矩陣的第二個維度。

Flatten()

(5)Reshape層:該層的作用和numpy.reshape一樣,就是將輸入的維度重構成特定的shape。

Reshape(target_shape)

參數說明:

target_shape:目標矩陣的維度,不包含batch樣本數。如我們想要一個9個元素的輸入向量重構成一個( None, 3, 3) 的二維矩陣:Reshape((3,3), input_length=(16, ))

(6)卷積層:卷積操作分為一維、二維、三維,分別為Conv1D、Conv2D、Conv3D。一維卷積主要應用於以時間序列數據或文本 數據,二維卷積通常應用於圖像數據。由於這三種的使用和參數都基本相同,所以主要以處理圖像數據的Conv2D進行說明。

Conv2D(filters, kernel_size, strides=(1, 1), padding='valid') 

參數說明:

filters:卷積核的個數。kernel_size:卷積核的大小。strdes:步長,二維中默認為(1, 1),一維默認為1。Padding:補“0”策略,'valid'指卷積後的大小與原來的大小可以不同,'same'則卷積後大小與原來大小 一 致。

(7)池化層:與卷積層一樣,最大統計量池化和平均統計量池也有三種,分別為MaxPooling1D、MaxPooling2D、MaxPooling3D、AveragePooling1D、AveragePooling2D、AveragePooli ng3D,

由於使用和參數基本相同,所以主要以MaxPooling2D進行說明。

MaxPooling(pool_size=(2,2), strides=None, padding=’valid’)

參數說明:

pool_size:長度為2的整數tuple,表示在橫向和縱向的下采樣樣子,一維則為縱向的下采樣因子padding:和卷積層的padding一樣。

(8) 循環層:循環神經網絡中的RNN、LSTM和GRU都繼承本層,所以該父類的參數同樣使用於對應的子類SimpleRNN、LSTM和GRU。

Recurrent(return_sequences=False)

參數說明:

return_sequences:控制返回的類型,“False”返回輸出序列的最後一個輸出,“True”則返回整個序列。當我們要搭建多層神經網絡(如深層LSTM時,若不是最後一層,則需要將該參數設為True。

(9) 嵌入層:該層只能用在模型的第一層,是將所有索引標號的稀疏矩陣映射到緻密的低維矩陣。如我們對文本數據進行處理時,我們對每個詞編號後,我們希望將詞編號變成詞向量就可以使 用嵌入層。

Embedding(input_dim, output_dim, input_length)

參數說明:

Input_dim:大於或等於0的整數,字典的長度即輸入數據的個數。output_dim:輸出的維度,如詞向量的維度。input_length:當輸入序列的長度為固定時為該長度,然後要在該層後加上Flatten層,然後再加上Dense層,則必須指定該參數,否則Dense層無法自動推斷輸出的維度。

該層可能有點費解,舉個例子,當我們有一個文 本,該文本有100句話,我們已經通過一系列操作,使得文本變成一個(100,32)矩陣,每行代表一句話,每個元素代表一個詞,我們希望將該詞變為64維的詞向量。

Embedding(100, 64, input_length=32) 則輸出的矩陣的shape變為(100, 32, 64):即每個詞已經變成一個64維的詞向量。


2 模型搭建

講完了一些常用層的語法後,接下來我們通過模型搭建來說明Keras的方便性。Keras中設定了兩類深度學習的模型,一類是序列模型(Sequential類);另一類是通用模型(Model 類)。下面我們通過搭建下圖模型進行講解。

使用Keras進行深度學習:(一)Keras 入門

圖1 兩層神經網絡



假設我們有一個兩層神經網絡,其中輸入層為784個神經元,隱藏層為32個神經元,輸出層為10個神經元,其中隱藏層使用ReLU激活函數,輸出層使用Softmax激活函數。分別使用序列模型和通用模型實現如下:

使用Keras進行深度學習:(一)Keras 入門

圖 2:導入相關庫




使用Keras進行深度學習:(一)Keras 入門

圖 3:序列模型實現



使用序列模型,首先我們要實例化Sequential類,之後就是使用該類的add函數加入我們想要的每一層,從而實現我們的模型。

使用Keras進行深度學習:(一)Keras 入門

圖 4:通用模型實現



使用通用模型,首先要使用Input函數將輸入轉化為一個tensor,然後將每一層用變量存儲後,作為下一層的參數,最後使用Model類將輸入和輸出作為參數即可搭建模型。

從以上兩類模型的簡單搭建,都可以發現Keras在搭建模型比起Tensorflow等簡單太多了,如Tensorflow需要定義每一層的權重矩陣,輸入用佔位符等,這些在Keras中都不需要,我們只要在第一層定義輸入維度,其他層定義輸出維度就可以搭建起模型,通俗易懂,方便高效,這是Keras的一個顯著的優勢。

3 模型優化和訓練


(1)

compile(optimizer, loss, metrics=None)

參數說明:

optimizer:優化器,如:’SGD‘,’Adam‘等
loss:定義模型的損失函數,如:’mse’,’mae‘等
metric:模型的評價指標,如:’accuracy‘等

(2)fit(x=None,y=None,batch_size=None,epochs=1,verbose=1,validation_split=0.0)

參數說明:

x:輸入數據。
y:標籤。
batch_size:梯度下降時每個batch包含的樣本數。
epochs:整數,所有樣本的訓練次數。

verbose:日誌顯示,0為不顯示,1為顯示進度條記錄,2為每個epochs輸出一行記錄。validation_split:0-1的浮點數,切割輸入數據的一定比例作為驗證集。
使用Keras進行深度學習:(一)Keras 入門

圖 5:優化和訓練實現


最後用以下圖片總結keras的模塊,下一篇文章我們將會使用keras來進行項目實踐,從而更好的體會Keras的魅力。

使用Keras進行深度學習:(一)Keras 入門



對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站http://www.panchuang.net 我們的公眾號:磐創AI。


分享到:


相關文章: