平面数据分类

平面数据分类

吴恩达深度学习第一课第三周编程作业

目的:分类空间中的点

方案:二分分类法

神经网络结构:单隐藏网络,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. ''''' 
  10. seed( ) :用于指定随机数生成时所用算法开始的整数值 
  11. 如果使用相同的seed( )值,则每次生成的随即数都相同 
  12. 如果不设置这个值,则系统根据时间来自己选择这个值 
  13. 此时每次生成的随机数因时间差异而不同。 
  14.    
  15. planar_utils:自建py文档 本例中的一些小工具集合 
  16. '''  
  17. #载入数据  
  18. X,Y=load_planar_dataset()  
  19.     
  20.     
  21. #设置神经网络结构  
  22. def layer_size(X,Y):  
  23.     n_x=X.shape[0]  
  24.         
  25.     n_y=Y.shape[0]  
  26.     return(n_x,n_y)  
  27.     
  28. #初始化参数  
  29. def initialize_parameters(n_x,n_h,n_y):  
  30.     W2=np.random.randn(n_y,n_h)*0.01  
  31.     b2=np.zeros(shape=(n_y,1))  
  32.     W1=np.random.randn(n_h,n_x)*0.01  
  33.     b1=np.zeros(shape=(n_h,1))  
  34.     parameters={'W2':W2,  
  35.                 'b2':b2,  
  36.                 'W1':W1,  
  37.                 'b1':b1}  
  38.     return parameters  
  39.     
  40. #正反向传播函数  
  41. def propagate(X,Y,parameters):  
  42.     m=X.shape[1]  
  43.     W2=parameters['W2']  
  44.     b2=parameters['b2']  
  45.     W1=parameters['W1']  
  46.     b1=parameters['b1']  
  47.     Z1=np.dot(W1,X)+b1  
  48.     A1=np.tanh(Z1)  
  49.     Z2=np.dot(W2,A1)+b2  
  50.     A2=sigmoid(Z2)  
  51.     
  52.     cost=(-1/m)*np.sum(Y*np.log(A2)+(1-Y)*np.log(1-A2))   #成本函数  
  53.     cost=float(np.squeeze(cost))  
  54.     #反向传播  
  55.     dZ2=A2-Y  
  56.     dW2=np.dot(dZ2,A1.T)/m  
  57.     db2=np.sum(dZ2,axis=1,keepdims=True)/m  
  58.     dZ1=np.dot(W2.T,dZ2)*(1-np.power(A1,2))  
  59.     dW1=np.dot(dZ1,X.T)/m  
  60.     db1=np.sum(dZ1,axis=1,keepdims=True)/m  
  61.     
  62.     grads={'dW2':dW2,  
  63.                 'db2':db2,  
  64.                 'dW1':dW1,  
  65.                 'db1':db1}  
  66.     return (grads,cost)  
  67.     
  68. #单步更新参数  
  69. def update_parameters(grads,parameters,learning_rate=1.2):  
  70.     dW2=grads['dW2']  
  71.     db2=grads['db2']  
  72.     dW1=grads['dW1']  
  73.     db1=grads['db1']  
  74.     
  75.     W2=parameters['W2']  
  76.     b2=parameters['b2']  
  77.     W1=parameters['W1']  
  78.     b1=parameters['b1']  
  79.     W2=W2-learning_rate*dW2  
  80.     b2=b2-learning_rate*db2  
  81.     W1=W1-learning_rate*dW1  
  82.     b1=b1-learning_rate*db1  
  83.     parameters={'W2':W2,  
  84.                 'b2':b2,  
  85.                 'W1':W1,  
  86.                 'b1':b1}  
  87.     return parameters  
  88.     
  89. #预测函数  
  90. def predict(parameters,X):  
  91.     W2=parameters['W2']  
  92.     b2=parameters['b2']  
  93.     W1=parameters['W1']  
  94.     b1=parameters['b1']  
  95.     Z1=np.dot(W1,X)+b1  
  96.     A1=np.tanh(Z1)  
  97.     Z2=np.dot(W2,A1)+b2  
  98.     A2=sigmoid(Z2)  
  99.     predictions=np.round(A2)  
  100.     return predictions  
  101.     
  102. #整合  
  103. def model2(X,Y,n_h,num_iterations,print_cost=False):  
  104.     n_x,n_y=layer_size(X,Y)  
  105.     parameters=initialize_parameters(n_x,n_h,n_y)  
  106.     for i in range(num_iterations):  
  107.         grads,cost=propagate(X,Y,parameters)  
  108.         parameters=update_parameters(grads,parameters)  
  109.         if print_cost and i%1000==0:  
  110.             print('after iterations cost%d:%f' %(i,cost))  
  111.     predictions=predict(parameters,X)  
  112.     #输出正确率  
  113.     print('Accurent rate:%d' %float((np.dot(Y,predictions.T)+np.dot(1-Y,1-predictions.T))/float(Y.size)*100)+'%')  
  114.     return parameters  
  115.     
  116. #正式运行  
  117. parameters=model2(X,Y,n_h=4,num_iterations=10000,print_cost=True)  
  118.     
  119. plot_decision_boundary(lambda x:predict(parameters,x.T),X,Y)  
  120. plt.title('h_y:4')  
  121. 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,当然也可以选择其它的值相乘

posted @ 2018-07-15 22:11  天字三号房  阅读(486)  评论(0编辑  收藏  举报