1. 程式人生 > >平面數據分類

平面數據分類

info map 第一課 mage 分享 自建 結算 mil 它的

平面數據分類

吳恩達深度學習第一課第三周編程作業

目的:分類空間中的點

方案:二分分類法

神經網絡結構:單隱藏網絡,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特征(隱藏層數量) 然後輸出

代碼步驟:

  1. 設置神經網絡結構
  2. 隨機初始化參數
  3. 正反向傳播
  4. 單步梯度下降
  5. 預測函數
  6. 整合函數
  7. 可視化分析

代碼

  1. import numpy as np
  2. import sklearn
  3. import matplotlib.pyplot as plt
  4. import sklearn.datasets
  5. import sklearn.linear_model
  6. from planar_utils import plot_decision_boundary,sigmoid,load_planar_dataset,load_extra_datasets
  7. np.random.seed(1)
  8. ‘‘‘‘‘
  9. seed( ) :用於指定隨機數生成時所用算法開始的整數值
  10. 如果使用相同的seed( )值,則每次生成的隨即數都相同
  11. 如果不設置這個值,則系統根據時間來自己選擇這個值
  12. 此時每次生成的隨機數因時間差異而不同。
  13. planar_utils:自建py文檔 本例中的一些小工具集合
  14. ‘‘‘
  15. #載入數據
  16. X,Y=load_planar_dataset()
  17. #設置神經網絡結構
  18. def layer_size(X,Y):
  19. n_x=X.shape[0]
  20. n_y=Y.shape[0]
  21. return(n_x,n_y)
  22. #初始化參數
  23. def initialize_parameters(n_x,n_h,n_y):
  24. W2=np.random.randn(n_y,n_h)*0.01
  25. b2=np.zeros(shape=(n_y,1))
  26. W1=np.random.randn(n_h,n_x)*0.01
  27. b1=np.zeros(shape=(n_h,1))
  28. parameters={‘W2‘:W2,
  29. ‘b2‘:b2,
  30. ‘W1‘:W1,
  31. ‘b1‘:b1}
  32. return parameters
  33. #正反向傳播函數
  34. def propagate(X,Y,parameters):
  35. m=X.shape[1]
  36. W2=parameters[‘W2‘]
  37. b2=parameters[‘b2‘]
  38. W1=parameters[‘W1‘]
  39. b1=parameters[‘b1‘]
  40. Z1=np.dot(W1,X)+b1
  41. A1=np.tanh(Z1)
  42. Z2=np.dot(W2,A1)+b2
  43. A2=sigmoid(Z2)
  44. cost=(-1/m)*np.sum(Y*np.log(A2)+(1-Y)*np.log(1-A2)) #成本函數
  45. cost=float(np.squeeze(cost))
  46. #反向傳播
  47. dZ2=A2-Y
  48. dW2=np.dot(dZ2,A1.T)/m
  49. db2=np.sum(dZ2,axis=1,keepdims=True)/m
  50. dZ1=np.dot(W2.T,dZ2)*(1-np.power(A1,2))
  51. dW1=np.dot(dZ1,X.T)/m
  52. db1=np.sum(dZ1,axis=1,keepdims=True)/m
  53. grads={‘dW2‘:dW2,
  54. ‘db2‘:db2,
  55. ‘dW1‘:dW1,
  56. ‘db1‘:db1}
  57. return (grads,cost)
  58. #單步更新參數
  59. def update_parameters(grads,parameters,learning_rate=1.2):
  60. dW2=grads[‘dW2‘]
  61. db2=grads[‘db2‘]
  62. dW1=grads[‘dW1‘]
  63. db1=grads[‘db1‘]
  64. W2=parameters[‘W2‘]
  65. b2=parameters[‘b2‘]
  66. W1=parameters[‘W1‘]
  67. b1=parameters[‘b1‘]
  68. W2=W2-learning_rate*dW2
  69. b2=b2-learning_rate*db2
  70. W1=W1-learning_rate*dW1
  71. b1=b1-learning_rate*db1
  72. parameters={‘W2‘:W2,
  73. ‘b2‘:b2,
  74. ‘W1‘:W1,
  75. ‘b1‘:b1}
  76. return parameters
  77. #預測函數
  78. def predict(parameters,X):
  79. W2=parameters[‘W2‘]
  80. b2=parameters[‘b2‘]
  81. W1=parameters[‘W1‘]
  82. b1=parameters[‘b1‘]
  83. Z1=np.dot(W1,X)+b1
  84. A1=np.tanh(Z1)
  85. Z2=np.dot(W2,A1)+b2
  86. A2=sigmoid(Z2)
  87. predictions=np.round(A2)
  88. return predictions
  89. #整合
  90. def model2(X,Y,n_h,num_iterations,print_cost=False):
  91. n_x,n_y=layer_size(X,Y)
  92. parameters=initialize_parameters(n_x,n_h,n_y)
  93. for i in range(num_iterations):
  94. grads,cost=propagate(X,Y,parameters)
  95. parameters=update_parameters(grads,parameters)
  96. if print_cost and i%1000==0:
  97. print(‘after iterations cost%d:%f‘ %(i,cost))
  98. predictions=predict(parameters,X)
  99. #輸出正確率
  100. print(‘Accurent rate:%d‘ %float((np.dot(Y,predictions.T)+np.dot(1-Y,1-predictions.T))/float(Y.size)*100)+‘%‘)
  101. return parameters
  102. #正式運行
  103. parameters=model2(X,Y,n_h=4,num_iterations=10000,print_cost=True)
  104. plot_decision_boundary(lambda x:predict(parameters,x.T),X,Y)
  105. plt.title(‘h_y:4‘)
  106. 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,當然也可以選擇其它的值相乘

平面數據分類