平面数据分类
平面数据分类
吴恩达深度学习第一课第三周编程作业
目的:分类空间中的点
方案:二分分类法
神经网络结构:单隐藏网络,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,当然也可以选择其它的值相乘