平面數據分類
平面數據分類
吳恩達深度學習第一課第三周編程作業
目的:分類空間中的點
方案:二分分類法
神經網絡結構:單隱藏網絡,n_h=4(n_h是一個超參數)
隱藏層使用的是tanh作為激活函數,輸出層是sigmoid函數
X是一個(2,400),Y是一個(1,400)的矩陣,X[0]表示x的坐標值,X[1]表示y的坐標值,從而確定平面上的一點
Y是一個很粗糙的行向量,前半部分都是0,後半部分都是1.
0表示一種顏色,1也表示一種顏色
通過學習,2特征(x的行數) 變 4特征(隱藏層數量) 然後輸出
代碼步驟:
- 設置神經網絡結構
- 隨機初始化參數
- 正反向傳播
- 單步梯度下降
- 預測函數
- 整合函數
- 可視化分析
代碼
- import numpy as np
- import sklearn
- import matplotlib.pyplot as plt
- import sklearn.datasets
- import sklearn.linear_model
- from planar_utils import plot_decision_boundary,sigmoid,load_planar_dataset,load_extra_datasets
- np.random.seed(1)
- ‘‘‘‘‘
- seed( ) :用於指定隨機數生成時所用算法開始的整數值
- 如果使用相同的seed( )值,則每次生成的隨即數都相同
- 如果不設置這個值,則系統根據時間來自己選擇這個值
- 此時每次生成的隨機數因時間差異而不同。
- planar_utils:自建py文檔 本例中的一些小工具集合
- ‘‘‘
- #載入數據
- X,Y=load_planar_dataset()
- #設置神經網絡結構
- def layer_size(X,Y):
- n_x=X.shape[0]
- n_y=Y.shape[0]
- return(n_x,n_y)
- #初始化參數
- def initialize_parameters(n_x,n_h,n_y):
- W2=np.random.randn(n_y,n_h)*0.01
- b2=np.zeros(shape=(n_y,1))
- W1=np.random.randn(n_h,n_x)*0.01
- b1=np.zeros(shape=(n_h,1))
- parameters={‘W2‘:W2,
- ‘b2‘:b2,
- ‘W1‘:W1,
- ‘b1‘:b1}
- return parameters
- #正反向傳播函數
- def propagate(X,Y,parameters):
- m=X.shape[1]
- W2=parameters[‘W2‘]
- b2=parameters[‘b2‘]
- W1=parameters[‘W1‘]
- b1=parameters[‘b1‘]
- Z1=np.dot(W1,X)+b1
- A1=np.tanh(Z1)
- Z2=np.dot(W2,A1)+b2
- A2=sigmoid(Z2)
- cost=(-1/m)*np.sum(Y*np.log(A2)+(1-Y)*np.log(1-A2)) #成本函數
- cost=float(np.squeeze(cost))
- #反向傳播
- dZ2=A2-Y
- dW2=np.dot(dZ2,A1.T)/m
- db2=np.sum(dZ2,axis=1,keepdims=True)/m
- dZ1=np.dot(W2.T,dZ2)*(1-np.power(A1,2))
- dW1=np.dot(dZ1,X.T)/m
- db1=np.sum(dZ1,axis=1,keepdims=True)/m
- grads={‘dW2‘:dW2,
- ‘db2‘:db2,
- ‘dW1‘:dW1,
- ‘db1‘:db1}
- return (grads,cost)
- #單步更新參數
- def update_parameters(grads,parameters,learning_rate=1.2):
- dW2=grads[‘dW2‘]
- db2=grads[‘db2‘]
- dW1=grads[‘dW1‘]
- db1=grads[‘db1‘]
- W2=parameters[‘W2‘]
- b2=parameters[‘b2‘]
- W1=parameters[‘W1‘]
- b1=parameters[‘b1‘]
- W2=W2-learning_rate*dW2
- b2=b2-learning_rate*db2
- W1=W1-learning_rate*dW1
- b1=b1-learning_rate*db1
- parameters={‘W2‘:W2,
- ‘b2‘:b2,
- ‘W1‘:W1,
- ‘b1‘:b1}
- return parameters
- #預測函數
- def predict(parameters,X):
- W2=parameters[‘W2‘]
- b2=parameters[‘b2‘]
- W1=parameters[‘W1‘]
- b1=parameters[‘b1‘]
- Z1=np.dot(W1,X)+b1
- A1=np.tanh(Z1)
- Z2=np.dot(W2,A1)+b2
- A2=sigmoid(Z2)
- predictions=np.round(A2)
- return predictions
- #整合
- def model2(X,Y,n_h,num_iterations,print_cost=False):
- n_x,n_y=layer_size(X,Y)
- parameters=initialize_parameters(n_x,n_h,n_y)
- for i in range(num_iterations):
- grads,cost=propagate(X,Y,parameters)
- parameters=update_parameters(grads,parameters)
- if print_cost and i%1000==0:
- print(‘after iterations cost%d:%f‘ %(i,cost))
- predictions=predict(parameters,X)
- #輸出正確率
- print(‘Accurent rate:%d‘ %float((np.dot(Y,predictions.T)+np.dot(1-Y,1-predictions.T))/float(Y.size)*100)+‘%‘)
- return parameters
- #正式運行
- parameters=model2(X,Y,n_h=4,num_iterations=10000,print_cost=True)
- plot_decision_boundary(lambda x:predict(parameters,x.T),X,Y)
- plt.title(‘h_y:4‘)
- plt.show()
代碼小結:
plt.scatter(x,y,s,c,cmap)
s表示圓點大小 c表示顏色,重點在於cmap,
cmap=plt.cm.Spectral表示顏色遵循光譜分色,根據c數組中的數字種類,進行分色,
如0代表了紅色,1代表了藍色(當只有2中分色時)
在dot是容易出事,可以停下來驗證他們矩陣形狀
正確率輸出函數語句分析;
float((np.dot(Y,predictions.T)+np.dot(1-Y,1-predictions.T))/float(Y.size)*100)+‘%‘)
首先是兩個點積相加,然後除以Y的個數
第一個點積,表示累加預測值與實際值都等於1的情況
第二個點積,表示累加預測值與實際值都等於0的情況
兩個相加,不就等於預測值與實際值相等的情況
plot_decision_boundary(lambda x:predict(parameters,x.T),X,Y)
第一個參數是把整個預測函數以及學習好的參數傳過去了
利用pyplot畫塊這些就沒有去深入了解了
再補上隨機初始化權重隨筆
如果權重W直接初始化為0 ,那麽1層的節點結算會完全相同,即造成學習完的W是一個(1,n)的矩陣
W初始值一般取一個非常小的值所以乘上了0.01,當然也可以選擇其它的值相乘
平面數據分類