Keras 從零開始構建深度神經網絡

Keras 是一個用於定義和訓練神經網絡的高階API。簡單的說,Keras 是對 TensorFlow 等深度學習框架的更高一層的封裝,以提供更加優雅,用戶友好的接口設計。所以,Keras 不能獨立運行,須要底層框架的支持,這個底層框架能夠是 TensorFlow, CNTK, Theano。推薦使用 TensorFlow , 本文也是以 TensorFlow 爲例。python

1. 預備知識

1.1 什麼是神經網絡?

在人工智能領域,一般所說的「神經網絡」,完整說法應該是「人工神經網絡」。它是人類爲了使機器具有人類的智力行爲,使用計算機算法模擬人類神經系統,開發的一種機器學習技術。人類的神經系統是由一個個神經元彼此相連,構成的複雜網絡系統。算法

下圖是大腦神經元結構,神經元從它的多個樹突(DENDRITES)接收輸入(神經衝動),通過處理,判斷是否經過軸突(AXON)輸出神經衝動。bash

1.2 感知器 Perceptron

正如神經元是構成大腦神經系統的基本單元,感知器(Perceptron)是構人工神經網絡的基本單元。它接收多個輸入(x_1, x_2, \ldots, x_n),經過線性函數和激活函數(Step Function 是激活函數的一種),獲得輸出\hat{y}微信

線性函數:網絡

f(x) = \mathbf{W}\mathbf{x} + b

其中,\mathbf{W}\mathbf{x} 爲向量,\mathbf{W}=(w_1, w_2, \ldots, w_n), \mathbf{x}=(x_1, x_2, \ldots, x_n),所以也能夠展開以下:架構

w_1 x_1 + w_2 x_2 + \ldots + w_n x_n + b = y'

Step Function 是階越函數,在神經網絡中,一般稱這類函數爲激活函數:框架

f(x) = \left\{ \begin{array}{rl}
 0 &\mbox{ if $x<0$} \\
 1 &\mbox{ if $x>=0$ }
       \end{array} \right.

1.3 神經網絡與線性代數

神經網絡的數學原理是線性代數。在單個感知器中,輸入到輸出,實際就是,輸入向量 \mathbf{x} 與權重向量 \mathbf{W} 的點積,再加上一個偏置單元 b (標量)。爲了表示的一致性,一般也會將偏置單元看做是,輸入爲 1 , 權重爲 b 的特殊單元。機器學習

(x_1, x_2, \cdots, x_n, 1) \cdot (w_1, w_2, \cdots, w_n, b) = y'

1 個感知器對應 1 個輸出,多個具備不一樣權重向量感知器,接收相同輸入向量,就對應多個輸出,這樣一組感知器就構成神經網絡的層(layer)。相比於單個感知器,層能接收多個輸入,並獲得多個輸出,而權重再也不以向量表示,取而代之爲矩陣。所以,層的數學模型就是,輸入向量乘以權重矩陣,獲得輸出向量。函數

(x_1, x_2, \cdots, x_n, 1)
\left| \begin{array}{ccc}
  w_{11} & w_{12} & \cdots & w_{1m} \\
  w_{21} & w_{22} & \cdots & w_{2m} \\
  \cdots & \cdots & \cdots & \cdots \\
  w_{n1} & w_{n2} & \cdots & w_{nm} \\
  b_1 & b_2 & \cdots & b_m
  \end{array}\right| = (y_1, y_2, \cdots, y_m)

1.4 深度神經網絡

所謂的深度學習或深度神經網絡,就是由多個感知層首尾相連,即前一個層的輸出對應後一個層的輸入,構成的多層感知器。其中,第1層也叫輸入層(Input Layer),最後1層也叫輸出層(Output Layer),中間層也叫隱藏層(Hidden Layer)。學習

2. 準備工做

在對深度神經網絡有個基本概念後,接下來使用 Keras 搭建一個深度神經網絡模型。在此以前,須要先安裝相關軟件和 python 包。

若是還沒安裝 Anaconda ,建議先安裝,下載地址:www.anaconda.com/distributio…

確認已經安裝了 Anaconda 後,打開命令行終端,輸入以下命令,建立環境並安裝相關 python 包。

conda create -n DNN python=3.6
conda activate DNN

pip install --upgrade pip
pip install numpy pandas matplotlib jupyter notebook tensorflow Keras
pip install seaborn

pip freeze | grep -Ei "numpy|pandas|matplotlib|tensorflow|Keras"
複製代碼

out:

Keras==2.3.0
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.0
matplotlib==3.1.1
numpy==1.17.2
pandas==0.25.1
tensorflow==1.14.0
tensorflow-estimator==1.14.0
複製代碼

3. 使用 Keras 建立深度神經網絡模型

Keras 提供兩種建立神經網絡的方法: 序列化模型(Sequential model),函數式API(Functional API)。

下面分別使用兩種方法,建立最簡單的3層神經網絡模型,1個輸入層,1個隱藏層和1個輸出層,其中輸入大小(shape)爲 100, 輸出大小爲 10,隱藏層大小爲 32。

3.1 序列化模型(Sequential model)

from keras.models import Sequential
from keras.layers.core import Dense
複製代碼

建立序列模型:

model = Sequential()
複製代碼

給模型添加層。Keras 將根據第1層自動推斷後續全部層的形狀。這意味着,你只需爲第1層設置輸入維度。

model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(10, activation='softmax'))
複製代碼

編譯模型,指定損失函數,優化程序和評估指。

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])
複製代碼

查看模型架構:

model.summary()
複製代碼
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 32)                3232      
_________________________________________________________________
dense_2 (Dense)              (None, 10)                330       
=================================================================
Total params: 3,562
Trainable params: 3,562
Non-trainable params: 0
_________________________________________________________________
複製代碼

3.2 函數式API(Functional API)

Keras 函數式API用來定義結構更爲複雜的模型。例如多輸出模型,有向無環圖或具備共享層的模型。

from keras.layers import Input, Dense
from keras.models import Model
複製代碼
# 返回一個張量
inputs = Input(shape=(100, ))

# 給模型層實例,傳入輸入張量,返回一個輸出張量
output_1 = Dense(32, activation='relu')(inputs)
outputs = Dense(10, activation='softmax')(output_1)

# 根據輸入和輸出,建立一個包含一個輸入層,一個隱藏層和一個輸出層的模型
model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 查看模型結構
model.summary()
複製代碼
Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 100)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 32)                3232      
_________________________________________________________________
dense_4 (Dense)              (None, 10)                330       
=================================================================
Total params: 3,562
Trainable params: 3,562
Non-trainable params: 0
_________________________________________________________________
複製代碼

結語

本文從初學者角度,介紹深度神經網絡的基本概念和數學原理,而後經過使用很是流行深度學習框架 Keras 提供的兩種方法,分別建立了相同結構的模型,引導讀者從理論過渡到實踐。理論深奧難懂,但經過封裝良好的框架,卻能在最短期內,將煊赫一時地深度學習技術投入實踐。但願本文可以幫助對深度學習感興趣的讀者,邁出進入深度學習殿堂的第一步。


微信掃描二維碼 獲取最新技術原創

相關文章
相關標籤/搜索