Y是一个很粗糙的行向量,前半部分都是0,后半部分都是1.
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()
float((np.dot(Y,predictions.T)+np.dot(1-Y,1-predictions.T))/float(Y.size)*100)+‘%‘)