神經網路基礎及Keras入門
這是崔斯特的第七十三篇原創文章
深度學習 (๑• . •๑)
神經網路定義
人工神經網路,簡稱神經網路,在機器學習和認知科學領域,是一種模仿生物神經網路(動物的中樞神經系統,特別是大腦)的結構和功能的數學模型或計算模型,用於對函式進行估計或近似。
為了描述神經網路,我們先從最簡單的神經網路講起,這個神經網路僅由一個“神經元”構成,以下即是這個“神經元”的圖示:
這個“神經元”是一個以 及截距
為輸入值的運算單元,其輸出為
,其中函式
被稱為“啟用函式”。在本教程中,我們選用sigmoid函式作為 啟用函式
可以看出,這個單一“神經元”的輸入-輸出對映關係其實就是一個邏輯迴歸(logistic regression)。
神經網路模型
所謂神經網路就是將許多個單一“神經元”聯結在一起,這樣,一個“神經元”的輸出就可以是另一個“神經元”的輸入。例如,下圖就是一個簡單的神經網路:
我們用 來表示網路的層數,本例中
,我們將第 層記為
,於是
是輸入層,輸出層是
。本例神經網路有引數
,其中
(下面的式子中用到)是第 層第 單元與第
層第 單元之間的聯接引數(其實就是連線線上的權重,注意標號順序),
是第
層第 單元的偏置項。因此在本例中,
Line"/> ,
。注意,沒有其他單元連向偏置單元(即偏置單元沒有輸入),因為它們總是輸出
。同時,我們用
表示第 層的節點數(偏置單元不計在內)。
Keras實戰
使用keras實現如下網路結構, 並訓練模型:
使用場景:
輸入值 (x1,x2,x3)
代表人的身高體重和年齡, 輸出值 (y1,y2)
import numpy as np # 總人數是1000, 一半是男生 n = 1000 # 所有的身體指標資料都是標準化資料, 平均值0, 標準差1 tizhong = np.random.normal(size = n) shengao = np.random.normal(size=n) nianling = np.random.normal(size=n) # 性別資料, 前500名學生是男生, 用數字1表示 gender = np.zeros(n) gender[:500] = 1 # 男生的體重比較重,所以讓男生的體重+1 tizhong[:500] += 1 # 男生的身高比較高, 所以讓男生的升高 + 1 shengao[:500] += 1 # 男生的年齡偏小, 所以讓男生年齡降低 1 nianling[:500] -= 1
建立模型
model = Sequential() # 只有一個神經元, 三個輸入數值 model.add(Dense(4, input_dim=3, kernel_initializer='random_normal', name="Dense1")) # 啟用函式使用softmax model.add(Activation('relu', name="hidden")) # 新增輸出層 model.add(Dense(2, input_dim=4, kernel_initializer='random_normal', name="Dense2")) # 啟用函式使用softmax model.add(Activation('softmax', name="output"))
編譯模型
需要指定優化器和損失函式:
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
訓練模型
# 轉換成one-hot格式 from keras import utils gender_one_hot = utils.to_categorical(gender, num_classes=2) # 身體指標都放入一個矩陣data data = np.array([tizhong, shengao, nianling]).T # 訓練模型 model.fit(data, gender_one_hot, epochs=10, batch_size=8)
輸出(stream): Epoch 1/10 1000/1000 [==============================] - 0s 235us/step - loss: 0.6743 - acc: 0.7180 Epoch 2/10 1000/1000 [==============================] - 0s 86us/step - loss: 0.6162 - acc: 0.7310 Epoch 3/10 1000/1000 [==============================] - 0s 88us/step - loss: 0.5592 - acc: 0.7570 Epoch 4/10 1000/1000 [==============================] - 0s 87us/step - loss: 0.5162 - acc: 0.7680 Epoch 5/10 1000/1000 [==============================] - 0s 89us/step - loss: 0.4867 - acc: 0.7770 Epoch 6/10 1000/1000 [==============================] - 0s 88us/step - loss: 0.4663 - acc: 0.7830 Epoch 7/10 1000/1000 [==============================] - 0s 87us/step - loss: 0.4539 - acc: 0.7890 Epoch 8/10 1000/1000 [==============================] - 0s 86us/step - loss: 0.4469 - acc: 0.7920 Epoch 9/10 1000/1000 [==============================] - 0s 88us/step - loss: 0.4431 - acc: 0.7940 Epoch 10/10 1000/1000 [==============================] - 0s 88us/step - loss: 0.4407 - acc: 0.7900 輸出(plain):
進行預測
test_data = np.array([[0, 0, 0]]) probability = model.predict(test_data) if probability[0, 0]>0.5: print('女生') else: print('男生')
輸出(stream): 女生
關鍵詞解釋
- input_dim: 輸入的維度數
- kernel_initializer: 數值初始化方法, 通常是正太分佈
- batch_size: 一次訓練中, 樣本資料被分割成多個小份, 每一小份包含的樣本數叫做batch_size
- epochs: 如果說將所有資料訓練一次叫做一輪的話。epochs決定了總共進行幾輪訓練。
- optimizer: 優化器, 可以理解為求梯度的方法
- loss: 損失函式, 可以理解為用於衡量估計值和觀察值之間的差距, 差距越小, loss越小
- metrics: 類似loss, 只是metrics不參與梯度計算, 只是一個衡量演算法準確性的指標, 分類模型就用accuracy