神經網絡基礎及Keras入門

神經網絡定義

人工神經網絡,簡稱神經網絡,在機器學習和認知科學領域,是一種模仿生物神經網絡(動物的中樞神經系統,特別是大腦)的結構和功能的數學模型或計算模型,用於對函數進行估計或近似。

爲了描述神經網絡,我們先從最簡單的神經網絡講起,這個神經網絡僅由一個“神經元”構成,以下即是這個“神經元”的圖示:

可以看出,這個單一“神經元”的輸入-輸出映射關係其實就是一個邏輯迴歸(logistic regression)。

神經網絡模型

所謂神經網絡就是將許多個單一“神經元”聯結在一起,這樣,一個“神經元”的輸出就可以是另一個“神經元”的輸入。例如,下圖就是一個簡單的神經網絡:

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

創建模型

from keras import Sequential
from keras.layers import Dense, Activation

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

參考:

  • http://ufldl.stanford.edu
  • https://mlln.cn/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章