《卷積神經網路的Python實現》筆記

HitStuHan發表於2020-12-29

線性分類器

線性模型

LinearClassification,線性分類中分值函式的程式碼實現。

import numpy as np

D = 784 #資料維度 28*28*1
K = 10 #型別數 10個數字

N = 128 #樣本數量

X = np.random.randn(N,D) #資料矩陣,每一行一個樣本
# print(X)
W = 0.01*np.random.randn(D,K)
# print(W)
b = np.zeros((1,K))
# print(b)

scores = np.dot(X,W) + b
#dot是矩陣乘法
#廣播機制,numpy自動識別意圖,不必將b轉成N*K大小的矩陣。

softmax損失函式(書中用的是softmax,對於SVM並沒有太多的講解)

使用上文程式碼,繼續編寫。

構造指數化分值矩陣,樣本歸一化,負對數損失函式。

y = np.random.randint(K,size= N)# y為樣本標籤
# np.random.randint和random.randint有不同,前者區間為前閉後開,後者區間為前閉後閉
# np.random.randint(K,size = K)第一個引數為區間[0,K),第二個引數為矩陣列數,即大小為N的向量

#指數化分治矩陣:使用以e為底的指數函式,將分值由實數對映為正實數。
exp_scores = np.exp(scores)

#樣本歸一化係數
exp_scores_sum = np.sum(exp_scores, axis=1)
# axis=1表示,對於N*K的矩陣,每一列不變,將每一行的數相加。

#樣本真實類別的歸一化分值
corect_probs = exp_scores[range(N),y]/exp_scores_sum

#負對數損失函式
corect_logprobs = -np.log(corect_probs)

梯度下降法

以f(x)= x^2/2 為例

alpha = 1 #二次項係數
epslon = 0.5 #學習率
iter_num = 100 #迴圈次數
x0 =1 #輸入值

def f(x):
    return alpha*x**2/2

def df(x):
    return alpha*x

def GD_update(x):
    return x-epslon*df(x)

x = x0

for k in range(iter_num):
    x = GD_update(x)
    print(k,x,f(x),df(x))

正則化

正則化也是重要的概念,他能夠控制模型額學習容量,減弱過擬合的風險。

神經網路

三層神經網路程式碼

這裡採用ReLU啟用函式,原因如下:
1、sigmoid啟用函式在輸入比較大和負數的時候,函式值接近於1或者0,處於飽和狀態,梯度為0。梯度為0是很危險的,不能夠繼續進行有效的學習。而現在也很少使用sigmoid作為啟用函式了。
2、tanh啟用函式是sigmoid函式的放大平移,雖然也存在飽和區域,但是效果更好些。

程式碼中,dim1與dim2為超引數。這裡我們就要考慮到,引數數量越多,模型學習容量越大,越容易導致過擬合,這就需要正則化。通常正則化是權重引數的L2範數。

import numpy as np

D = 784 #28*28*1資料維度
K = 10 #類別數
N = 128 #樣本數量
dim1 = 128 #隱含層寬度
dim2 = 36
W1 = 0.01 * np.random.randn(D,dim1)
b1 = np.zeros((1,dim1))
W2 = 0.01*np.random.randn(dim1,dim2)
b2 = np.zeros((1,dim2))
W3 = 0.01*np.random.randn(dim2,K)
b3 = np.zeros((1,K))

X = np.random.randn(N,D)# 資料矩陣,每行一個樣本
hidden_layer1 = np.maximum(0,np.dot(X,W1)+b1)
#ReLU啟用函式啟用
hidden_layer2 = np.maximum(0,np.dot(hidden_layer1,W2)+b2)
#ReLU啟用函式啟用
scores = np.dot(hidden_layer2,W3)+b3
#輸出層不需要啟用函式

相關文章