一.項目背景
本項目在之前項目分類模型基礎上神經網絡應用(一)進一步拓展神經網絡應用,相比之前本項目增加了新的知識點,比如正則化,softmax函數和交叉熵損失函數等。
二.前期準備
1.正則化
1)解釋:在機器學習中為了防止模型過擬合(簡單說就是在訓練集上樣本表現的
很好,在測試集上表現的很差),經常需要進行正則化,所謂正則化簡單來說就是讓模
型系數變得相對小一點,防止數據稍微變化引起模型圖形曲線較大波動,總之一句話,
讓模型曲線表現更加平穩。
2)分類:正則化總體分類為L1正則化和L2正則化。兩者區別在于范數級別不同,
L2正則化是||w||2,L1正則化是||w||1范數,并且L2正則傾向于系數W盡量均衡(非
零分量個數盡量多),L1正則化使W分類盡量稀疏(非零分量個數盡量少),我們以線
性回歸為例,簡單說明一下。
【注】正則項不包括截距項。
2.Softmax函數
1)Softmax經常被應用在多分類任務的神經網絡中的輸出層,簡單理解可以認為
Softmax輸出的是幾個類別選擇的概率。比如我有一個二分類任務,Softmax函數可以
根據它們相對的大小,輸出二個類別選取的概率,并且概率和為1。表達式如下,Si代
表的是第i個神經元的輸出。
softmax函數
3.交叉熵損失函數
在神經網絡反向傳播中需要損失函數,損失函數其實表示的是真實值與網絡的估計
值的誤差,有了這個誤差我們才能知道怎樣去修改網絡中的權重。損失函數可以有很多
形式,這里用的是交叉熵函數,主要是由于這個求導結果比較簡單,易于計算,并且交
叉熵解決某些損失函數學習緩慢的問題,函數表達式如下
它的導數推到過程我們就不再說明,網上有很多資料大家可以參考,針對本項目分類
模型,我們最終結果為如下,也就是我們的預測概率值減去目標值。
三.實現過程
1.生成數據
#生成數據
def generate_data():
#設定種子數,保定生成數據相同
np.random.seed(0)
#生成數據集和標簽,noise表示產生噪音
X, y = datasets.make_moons(200, noise=0.20)
#返回數據集
return X, y
2.構建模型
#計算損失函數
def calculate_loss(model, X, y):
#訓練樣本個數
num_examples = len(X) # training set size
#加載模型參數
W1, b1, W2, b2 = model['W1'], model['b1'], model['W2'], model['b2']
#前向傳播
z1 = X.dot(W1) + b1
a1 = np.tanh(z1)
z2 = a1.dot(W2) + b2
exp_scores = np.exp(z2)
#softmax函數歸一化
probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
#定義交叉熵損失函數
corect_logprobs = -np.log(probs[range(num_examples), y])
#計算總的損失函數
data_loss = np.sum(corect_logprobs)
#L2正則化,防止過擬合
data_loss += Config.reg_lambda / 2 * (np.sum(np.square(W1)) + np.sum(np.square(W2)))
#除以樣本總數
return 1. / num_examples * data_loss
#構建模型
def build_model(X, y, nn_hdim, num_passes=20000, print_loss=False):
#樣本個數
num_examples = len(X)
#記錄隨機中子數
np.random.seed(0)
#初始化神經網絡參數
W1 = np.random.randn(Config.nn_input_dim, nn_hdim) / np.sqrt(Config.nn_input_dim)
b1 = np.zeros((1, nn_hdim))
W2 = np.random.randn(nn_hdim, Config.nn_output_dim) / np.sqrt(nn_hdim)
b2 = np.zeros((1, Config.nn_output_dim))
#存儲模型參數
model = {}
#遍歷每一輪
for i in range(0, num_passes):
#前向傳播
z1 = X.dot(W1) + b1
#函數表達式(e(z)-e(-z))/(e(z)+e(-z))
#隱藏層輸出
a1 = np.tanh(z1)
z2 = a1.dot(W2) + b2
#輸出層輸出
exp_scores = np.exp(z2)
#計算概率
probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
#反向傳播
delta3 = probs
#計算損失函數導數
delta3[range(num_examples), y] -= 1
#計算w2梯度
dW2 = (a1.T).dot(delta3)
#計算b2梯度
db2 = np.sum(delta3, axis=0, keepdims=True)
#計算輸入層到隱藏層總誤差
delta2 = delta3.dot(W2.T) * (1 - np.power(a1, 2))
#計算w1梯度
dW1 = np.dot(X.T, delta2)
#計算b1梯度
db1 = np.sum(delta2, axis=0)
#正則化系數w(只對w進行正則化,b不改變)
dW2 += Config.reg_lambda * W2
dW1 += Config.reg_lambda * W1
#更新參數
W1 += -Config.epsilon * dW1
b1 += -Config.epsilon * db1
W2 += -Config.epsilon * dW2
b2 += -Config.epsilon * db2
#存儲模型參數
model = {'W1': W1, 'b1': b1, 'W2': W2, 'b2': b2}
#輸出損失函數
if print_loss and i % 1000 == 0:
print("Loss after iteration %i: %f" % (i, calculate_loss(model, X, y)))
#返回模型參數
return model
3.預測樣本
#預測樣本
def predict(model, x):
#加載模型參數
W1, b1, W2, b2 = model['W1'], model['b1'], model['W2'], model['b2']
#前向傳播
z1 = x.dot(W1) + b1
a1 = np.tanh(z1)
z2 = a1.dot(W2) + b2
#計算總體輸出
exp_scores = np.exp(z2)
#softmax函數
probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
#返回預測概率最大值對應標簽
return np.argmax(probs, axis=1)
4.繪制圖形可視化
#繪制邊界線
def plot_decision_boundary(pred_func, X, y):
#分別設置間隔
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
#步長
h = 0.01
#生成網格數據
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
#預測整個網格z值
Z = pred_func(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
#繪制分割線
plt.contourf(xx,
yy,
Z,
cmap=plt.cm.Spectral)
#繪制散點圖
plt.scatter(X[:, 0],
X[:, 1],
c=y,
cmap=plt.cm.Spectral)
#顯示圖形
plt.show()
#可視化函數
def visualize(X, y, model):
#繪制圖形
plot_decision_boundary(lambda x:predict(model,x), X, y)
#設置標題
plt.title("Neural Network")
#主函數
def main():
#生成數據
X, y = generate_data()
#構建模型
model = build_model(X, y, 3, print_loss=True)
#可視化
visualize(X, y, model)
#預測準確樣本數
accuracy=0
#設定種子數,保定生成數據相同
np.random.seed(1)
#生成數據集和標簽,noise表示產生噪音
X_test, y = datasets.make_moons(200, noise=0.20)
#驗證測試集
for i in range(len(X_test)):
#預測測試集
if y[i]==predict(model,X_test[i]):
#預測準確數目
accuracy+=1
#輸出準確率
print("Accuracy:",float(accuracy)/len(X_test))
結論:準確率為96%(這里測試集數據我們添加了噪音),如果在產生測試集數據時取掉
noise參數(也就是說取掉噪音數據),準確率會更高。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
神經網絡
+關注
關注
42文章
4584瀏覽量
99083 -
函數
+關注
關注
3文章
4049瀏覽量
61392 -
Softmax
+關注
關注
0文章
9瀏覽量
2469
發布評論請先 登錄
相關推薦
人工神經網絡,人工神經網絡是什么意思
人工神經網絡,人工神經網絡是什么意思
神經網絡是一門活躍的邊緣性交叉學科.研究它的發展過程和前沿問題,具有重要的理論意義
發表于 03-06 13:39
?3308次閱讀
神經網絡基本介紹
神經網絡基本介紹,人工神經網絡(簡稱神經網絡,Neural Network)是模擬人腦思維方式的數學模型。
神經網絡是在現代生物學研究人腦組織成果的基礎上提出的,用來模擬人
發表于 12-06 15:07
?0次下載
什么是模糊神經網絡_模糊神經網絡原理詳解
模糊神經網絡就是模糊理論同神經網絡相結合的產物,它匯集了神經網絡與模糊理論的優點,集學習、聯想、識別、信息處理于一體。
發表于 12-29 14:40
?4.8w次閱讀
什么是神經網絡?什么是卷積神經網絡?
在介紹卷積神經網絡之前,我們先回顧一下神經網絡的基本知識。就目前而言,神經網絡是深度學習算法的核心,我們所熟知的很多深度學習算法的背后其實都是神經網絡。
用Python從頭實現一個神經網絡來理解神經網絡的原理1
有個事情可能會讓初學者驚訝:神經網絡模型并不復雜!『神經網絡』這個詞讓人覺得很高大上,但實際上神經網絡算法要比人們想象的簡單。
這篇文章完全是為新手準備的。我們會通過用Python從頭實現一個
用Python從頭實現一個神經網絡來理解神經網絡的原理2
有個事情可能會讓初學者驚訝:神經網絡模型并不復雜!『神經網絡』這個詞讓人覺得很高大上,但實際上神經網絡算法要比人們想象的簡單。
這篇文章完全是為新手準備的。我們會通過用Python從頭實現一個
用Python從頭實現一個神經網絡來理解神經網絡的原理3
有個事情可能會讓初學者驚訝:神經網絡模型并不復雜!『神經網絡』這個詞讓人覺得很高大上,但實際上神經網絡算法要比人們想象的簡單。
這篇文章完全是為新手準備的。我們會通過用Python從頭實現一個
用Python從頭實現一個神經網絡來理解神經網絡的原理4
有個事情可能會讓初學者驚訝:神經網絡模型并不復雜!『神經網絡』這個詞讓人覺得很高大上,但實際上神經網絡算法要比人們想象的簡單。
這篇文章完全是為新手準備的。我們會通過用Python從頭實現一個
卷積神經網絡原理:卷積神經網絡模型和卷積神經網絡算法
卷積神經網絡原理:卷積神經網絡模型和卷積神經網絡算法 卷積神經網絡(Convolutional Neural Network,CNN)是一種基于深度學習的人工
卷積神經網絡的基本原理 卷積神經網絡發展 卷積神經網絡三大特點
卷積神經網絡的基本原理 卷積神經網絡發展歷程 卷積神經網絡三大特點? 卷積神經網絡的基本原理 卷積神經網絡(Convolutional Ne
卷積神經網絡和深度神經網絡的優缺點 卷積神經網絡和深度神經網絡的區別
深度神經網絡是一種基于神經網絡的機器學習算法,其主要特點是由多層神經元構成,可以根據數據自動調整神經元之間的權重,從而實現對大規模數據進行預測和分類。卷積
發表于 08-21 17:07
?2583次閱讀
人工神經網絡和bp神經網絡的區別
人工神經網絡和bp神經網絡的區別? 人工神經網絡(Artificial Neural Network, ANN)是一種模仿人腦神經元網絡結構和功能的計算模型,也被稱為
評論