import numpy as np
import matplotlib.pyplot as plt
from testCases import *
import sklearn
import sklearn.datasets
import sklearn.linear_model
from planar_utils import plot_decision_boundary, sigmoid, load_planar_dataset, load_extra_datasets
X, Y = load_planar_dataset()
'''
x.shape (2, 400)
y.shape (1, 400)
'''
print(X[:, 0])
def layer_size(x, y, n_h):
'''
:param x: shape (2, 400)
:param y: shape (1, 400)
n_h: 隐藏层节点个数
'''
n_x = x.shape[1]
n_y = y.shape[1]
n_h = 4
Dict = {
'n_x': n_x,
'n_y': n_y,
'n_h': n_h
}
return Dict
def initial(n_x, n_y, n_h):
'''
:param n_x: 输入个数
:param n_y: 输出个数
:param n_h: 隐藏层节点数
:return:
'''
w1 = np.random.randn(n_h, n_x) * 0.01
b1 = np.zeros((n_h, 1))
w2 = np.random.randn(n_y, n_h) * 0.01
b2 = np.zeros((n_y, 1))
Dict = {
'w1': w1,
'b1': b1,
'w2': w2,
'b2': b2
}
return Dict
def forward_propagata(x , dict_wb):
'''
:param x:输入
:param dict_wb:相关权重及偏置
:return:
z1.shape (4, 400)
a1.shape (4, 400)
z2.shape (1, 400)
b2.shape (1, 1)
a2.shape (1, 400)
'''
w1 = dict_wb['w1']
b1 = dict_wb['b1']
w2 = dict_wb['w2']
b2 = dict_wb['b2']
z1 = np.dot(w1, x) + b1
a1 = np.tanh(z1)
# print(np.dot(w2, a1).shape, b2.shape)
z2 = np.dot(w2, a1) + b2
a2 = np.tanh(z2)
# 使用断言确保我的数据格式是正确的
assert (a2.shape == (1, x.shape[1]))
Dict = {
'z1': z1,
'a1': a1,
'z2': z2,
'a2': a2
}
return Dict
def backward_propagata(dict_forward, dict_wb, x, y):
'''
w1.shape (4, 2)
w2.shape (1, 4)
a1.shape (4, 400)
a2.shape (1, 400)
dz2.shape (1, 400)
dw2.shape (1, 4)
db2.shape (1, 1)
dz1.shape = z1.shape
dw1.shape = w1.shape
db1.shape = (1, 1)
'''
w1 = dict_wb['w1']
w2 = dict_wb['w2']
a1 = dict_forward['a1']
a2 = dict_forward['a2']
dz2 = a2 - y
dw2 = np.dot(dz2, a1.T)
db2 = (1 / x.shape[1]) * np.sum(dz2, axis=1, keepdims=True)
dz1 = np.multiply(np.dot(w2.T, dz2), 1 - np.power(a1, 2))
dw1 = np.dot(dz1, x.T)
db1 = (1 / x.shape[1]) * np.sum(dz1, axis=1, keepdims=True)
Dict = {
'dw2': dw2,
'db2': db2,
'dw1': dw1,
'db1': db1
}
return Dict
def updata(dict_wb, dict_dwdb, learningRate):
w1 = dict_wb['w1']
w2 = dict_wb['w2']
b1 = dict_wb['b1']
b2 = dict_wb['b2']
dw1 = dict_dwdb['dw1']
dw2 = dict_dwdb['dw2']
db1 = dict_dwdb['db1']
db2 = dict_dwdb['db2']
w1 = w1 - dw1 * learningRate
w2 = w2 - dw2 * learningRate
b1 = b1 - db1 * learningRate
b2 = b2 - db2 * learningRate
Dict = {
'w1': w1,
'b1': b1,
'w2': w2,
'b2': b2
}
return Dict
def trainModel(x, y, n_h, n_iter):
n_x = x.shape[0]
n_y = y.shape[0]
learningRate = 0.005
dict_wb = initial(n_x, n_y, n_h)
for i in range(n_iter):
dict_forward = forward_propagata(x, dict_wb)
dict_dwdb = backward_propagata(dict_forward, dict_wb, x, y)
dict_wb = updata(dict_wb, dict_dwdb, learningRate)
return dict_wb
def predict(dict_wb, x):
dict_forward = forward_propagata(x, dict_wb)
a2 = dict_forward['a2']
pred = np.round(a2)
return pred
print(1)
dict_wb = trainModel(X, Y, 4, 20000)
print(2)
print(dict_wb['w1'], dict_wb['w2'])
'''
[[-0.10197359 -6.57062786]
[-5.13298076 -5.41754432]
[ 0.00673609 0.03952171]
[-5.51919058 6.41997001]]
[[-0.99171186 0.7163268 -1.38306798 -0.72930063]]
'''
#
# tx = [1.20444229, 3.57611415]
# ty = predict(dict_wb, tx)
# print(ty)
#绘制边界
plot_decision_boundary(lambda x: predict(dict_wb, x.T), X, Y)
print(3)
plt.title("Decision Boundary for hidden layer size " + str(4))
print(4)
predictions = predict(dict_wb, X)
print ('准确率: %d' % float((np.dot(Y, predictions.T) + np.dot(1 - Y, 1 - predictions.T)) / float(Y.size) * 100) + '%')
plt.show()