前言
此篇博客不會涉及到複雜的數學和算法。相反,我將建立您對神經網絡如何工作初步的認識,並通過創建最小的神經網絡並進行訓練以完成一個簡單的任務來做到這一點。
神經網絡背後的想法
神經網絡是權重的集合。我們可以在一組輸入和輸出(目標或標籤)上訓練神經網絡。神經網絡內部的權重與輸入交互併產生輸出。在訓練網絡時,權重會更新,以使其嘗試將輸出與目標值進行匹配。簡而言之,神經網絡學習輸入和輸出之間的映射。現在,讓我們看看所有這些是什麼意思。
最小神經網絡
以下是**只有一個權重(w)**的最小神經網絡。我們給它輸入一個輸入(x),再乘以權重,結果就是網絡的輸出。
由於此神經網絡非常小,我們將在一個非常簡單的任務上對其進行訓練。我們的任務是向其提供任何數字,網絡應更改該數字的符號(即求相反數)。例如,如果我們輸入3,則網絡應輸出-3。
在Keras中創建神經網絡
現在,我將在Keras中構建和訓練最小的神經網絡,這是一個深度學習庫。現在不需要深入語法,這只是爲了建立初步認識。
import keras
from keras.layers import Dense
model = keras.models.Sequential()
model.add(Dense(units=1, use_bias=False, input_shape=(1,))) # 僅有的1個權重在這裏
model.compile(loss='mse', optimizer='adam')
非常好!通過以上代碼我們創建了只有一個權重的神經網絡。現在,讓我們創建用於訓練神經網絡的訓練數據。
創建數據
神經網絡是需要學習數據數據的,因此我們創建用於學習的數據。
import numpy as np
data_input = np.random.normal(size=100000) # 訓練數據
data_label = -(data_input) # 數據標籤
我們創建了訓練數據。數據包含100K隨機數,標籤爲該數字的負數。讓我們根據剛剛創建的數據訓練網絡。
訓練網絡
首先,神經網絡的權重是隨機初始化的。隨着我們不斷訓練網絡,權重也會隨之更新。
- 開始訓練之前,讓我們檢查一下權重(W)的大小。
model.layers[0].get_weights()
- 現在讓我們將數據放入網絡中。
Fitting
不過是training
的別稱。
model.fit(data_input, data_label)
- 我們已經訓練過網絡。正如您在進度欄中看到的那樣,該網絡已接受10萬個樣本的訓練。現在,讓我們向網絡提供一個值並檢查響應。
model.predict(np.array([2.5]))
- 網絡幾乎完成了任務。輸出非常接近輸入數字,並帶有相反的符號。隨着我們將在更多數據上訓練它,輸出將越來越接近目標值。另外,讓我們現在檢查訓練成功網絡後的權重值(W)。
model.layers[0].get_weights()
當我們根據數據訓練網絡時,權重從一開始的 隨機數值 變爲 大約-1。這很明顯,因爲必須將數字乘以-1才能更改其符號。
摘要
因此,基本上神經網絡可以學習任何輸入和輸出之間的映射,並可以用作函數逼近器。一旦學習了映射,它就可以爲您提供給它的任何輸入生成近似輸出。
完整代碼
# 定義網絡begin
import keras
from keras.layers import Dense
model = keras.models.Sequential()
model.add(Dense(units=1, use_bias=False, input_shape=(1,))) # 僅有的1個權重在這裏
model.compile(loss='mse', optimizer='adam')
# end
# 創建數據begin
import numpy as np
data_input = np.random.normal(size=1000000) # 訓練數據
data_label = -(data_input) # 數據標籤
# end
print('模型隨機權重分配爲:%s' % (model.layers[0].get_weights())) # 檢查隨機初始化的權重大小
model.fit(data_input, data_label) # 對創建的數據用創建的網絡進行訓練
print('模型進行預測:' % (model.predict(np.array([2.5])))) # 利用訓練好的模型進行預測
print('訓練完成後權重分配爲:%s' % (model.layers[0].get_weights())) # 再次查看訓練好的模型中的權重值