Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

时间:2023-03-09 17:35:01
Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

Planar data classification with one hidden layer

你会学习到如何:

  • 用单隐层实现一个二分类神经网络

  • 使用一个非线性激励函数,如 tanh

  • 计算交叉熵的损失值

  • 实现前向传播和后向传播

1 - Packages(导入包)

需要导入的包:

  • numpy:Python中的常用的科学计算库
  • sklearn:提供简单而高效的数据挖掘和数据分析工具
  • matplotlib:Python中绘图库
  • testCases: 提供了一些测试例子来评估函数的正确性
  • planar_utils: 提供各种有用的在这个任务中使用的函数
# Package imports
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 %matplotlib inline np.random.seed(1) # set a seed so that the results are consistent
% testCases.py 保存在本地

```python
import numpy as np def layer_sizes_test_case():
np.random.seed(1)
X_assess = np.random.randn(5, 3)
Y_assess = np.random.randn(2, 3)
return X_assess, Y_assess def initialize_parameters_test_case():
n_x, n_h, n_y = 2, 4, 1
return n_x, n_h, n_y def forward_propagation_test_case():
np.random.seed(1)
X_assess = np.random.randn(2, 3) parameters = {'W1': np.array([[-0.00416758, -0.00056267],
[-0.02136196, 0.01640271],
[-0.01793436, -0.00841747],
[ 0.00502881, -0.01245288]]),
'W2': np.array([[-0.01057952, -0.00909008, 0.00551454, 0.02292208]]),
'b1': np.array([[ 0.],
[ 0.],
[ 0.],
[ 0.]]),
'b2': np.array([[ 0.]])} return X_assess, parameters def compute_cost_test_case():
np.random.seed(1)
Y_assess = np.random.randn(1, 3)
parameters = {'W1': np.array([[-0.00416758, -0.00056267],
[-0.02136196, 0.01640271],
[-0.01793436, -0.00841747],
[ 0.00502881, -0.01245288]]),
'W2': np.array([[-0.01057952, -0.00909008, 0.00551454, 0.02292208]]),
'b1': np.array([[ 0.],
[ 0.],
[ 0.],
[ 0.]]),
'b2': np.array([[ 0.]])} a2 = (np.array([[ 0.5002307 , 0.49985831, 0.50023963]])) return a2, Y_assess, parameters def backward_propagation_test_case():
np.random.seed(1)
X_assess = np.random.randn(2, 3)
Y_assess = np.random.randn(1, 3)
parameters = {'W1': np.array([[-0.00416758, -0.00056267],
[-0.02136196, 0.01640271],
[-0.01793436, -0.00841747],
[ 0.00502881, -0.01245288]]),
'W2': np.array([[-0.01057952, -0.00909008, 0.00551454, 0.02292208]]),
'b1': np.array([[ 0.],
[ 0.],
[ 0.],
[ 0.]]),
'b2': np.array([[ 0.]])} cache = {'A1': np.array([[-0.00616578, 0.0020626 , 0.00349619],
[-0.05225116, 0.02725659, -0.02646251],
[-0.02009721, 0.0036869 , 0.02883756],
[ 0.02152675, -0.01385234, 0.02599885]]),
'A2': np.array([[ 0.5002307 , 0.49985831, 0.50023963]]),
'Z1': np.array([[-0.00616586, 0.0020626 , 0.0034962 ],
[-0.05229879, 0.02726335, -0.02646869],
[-0.02009991, 0.00368692, 0.02884556],
[ 0.02153007, -0.01385322, 0.02600471]]),
'Z2': np.array([[ 0.00092281, -0.00056678, 0.00095853]])}
return parameters, cache, X_assess, Y_assess def update_parameters_test_case():
parameters = {'W1': np.array([[-0.00615039, 0.0169021 ],
[-0.02311792, 0.03137121],
[-0.0169217 , -0.01752545],
[ 0.00935436, -0.05018221]]),
'W2': np.array([[-0.0104319 , -0.04019007, 0.01607211, 0.04440255]]),
'b1': np.array([[ -8.97523455e-07],
[ 8.15562092e-06],
[ 6.04810633e-07],
[ -2.54560700e-06]]),
'b2': np.array([[ 9.14954378e-05]])} grads = {'dW1': np.array([[ 0.00023322, -0.00205423],
[ 0.00082222, -0.00700776],
[-0.00031831, 0.0028636 ],
[-0.00092857, 0.00809933]]),
'dW2': np.array([[ -1.75740039e-05, 3.70231337e-03, -1.25683095e-03,
-2.55715317e-03]]),
'db1': np.array([[ 1.05570087e-07],
[ -3.81814487e-06],
[ -1.90155145e-07],
[ 5.46467802e-07]]),
'db2': np.array([[ -1.08923140e-05]])}
return parameters, grads def nn_model_test_case():
np.random.seed(1)
X_assess = np.random.randn(2, 3)
Y_assess = np.random.randn(1, 3)
return X_assess, Y_assess def predict_test_case():
np.random.seed(1)
X_assess = np.random.randn(2, 3)
parameters = {'W1': np.array([[-0.00615039, 0.0169021 ],
[-0.02311792, 0.03137121],
[-0.0169217 , -0.01752545],
[ 0.00935436, -0.05018221]]),
'W2': np.array([[-0.0104319 , -0.04019007, 0.01607211, 0.04440255]]),
'b1': np.array([[ -8.97523455e-07],
[ 8.15562092e-06],
[ 6.04810633e-07],
[ -2.54560700e-06]]),
'b2': np.array([[ 9.14954378e-05]])}
return parameters, X_assess ```
% planar_utils.py 保存在本地

```python
import matplotlib.pyplot as plt
import numpy as np
import sklearn
import sklearn.datasets
import sklearn.linear_model def plot_decision_boundary(model, X, y):
# Set min and max values and give it some padding
x_min, x_max = X[0, :].min() - 1, X[0, :].max() + 1
y_min, y_max = X[1, :].min() - 1, X[1, :].max() + 1
h = 0.01
# Generate a grid of points with distance h between them
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
# Predict the function value for the whole grid
Z = model(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# Plot the contour and training examples
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
plt.ylabel('x2')
plt.xlabel('x1')
plt.scatter(X[0, :], X[1, :], c=y.ravel(), cmap=plt.cm.Spectral) def sigmoid(x):
"""
Compute the sigmoid of x Arguments:
x -- A scalar or numpy array of any size. Return:
s -- sigmoid(x)
"""
s = 1/(1+np.exp(-x))
return s def load_planar_dataset():
np.random.seed(1)
m = 400 # number of examples
N = int(m/2) # number of points per class
D = 2 # dimensionality
X = np.zeros((m,D)) # data matrix where each row is a single example
Y = np.zeros((m,1), dtype='uint8') # labels vector (0 for red, 1 for blue)
a = 4 # maximum ray of the flower for j in range(2):
ix = range(N*j,N*(j+1))
t = np.linspace(j*3.12,(j+1)*3.12,N) + np.random.randn(N)*0.2 # theta
r = a*np.sin(4*t) + np.random.randn(N)*0.2 # radius
X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]
Y[ix] = j X = X.T
Y = Y.T return X, Y def load_extra_datasets():
N = 200
noisy_circles = sklearn.datasets.make_circles(n_samples=N, factor=.5, noise=.3)
noisy_moons = sklearn.datasets.make_moons(n_samples=N, noise=.2)
blobs = sklearn.datasets.make_blobs(n_samples=N, random_state=5, n_features=2, centers=6)
gaussian_quantiles = sklearn.datasets.make_gaussian_quantiles(mean=None, cov=0.5, n_samples=N, n_features=2, n_classes=2, shuffle=True, random_state=None)
no_structure = np.random.rand(N, 2), np.random.rand(N, 2) return noisy_circles, noisy_moons, blobs, gaussian_quantiles, no_structure
```

2 - Dataset(导入数据集)

首先,我们导入需要工作的数据。下面的代码将导入一个 "flower"二分类数据集到变量 X 和 Y.

X, Y = load_planar_dataset()

使用matplotlib可视化数据集。数据看起来像一朵“花”,上面有一些红色(标签y=0)和一些蓝色(y=1)点。您的目标是建立一个适合这些数据的模型。

# Visualize the data: c: 颜色;s:线宽; cmap:模块pyplot内置了一组颜色映射
plt.scatter(X[0, :], X[1, :], c=Y.reshape(400), s=40, cmap=plt.cm.Spectral);

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

你有:

  • 一个 numpy-array (矩阵)X: 包含你的特征(x1, x2)
  • 一个 numpy-array (向量)Y: 包含你的标签(red:0,  blue:1).

来第一次得到更好的数据是什么样子的感觉:

Exercise: 你有多少训练样本?另外,X和Y的维度是什么?

### START CODE HERE ### (≈ 3 lines of code)
shape_X = X.shape
shape_Y = Y.shape
m = shape_X[1] # training set size
### END CODE HERE ### print ('The shape of X is: ' + str(shape_X))
print ('The shape of Y is: ' + str(shape_Y))
print ('I have m = %d training examples!' % (m))
The shape of X is: (2, 400)
The shape of Y is: (1, 400)
I have m = 400 training examples!

Expected Output:

shape of X (2, 400)
shape of Y (1, 400)
m 400

3 - Simple Logistic Regression(简单的逻辑回归)

在建立一个完整的神经网络之前,让我们先看看逻辑回归在这个问题上的表现。可以使用sklearn的内置函数来实现这一点。运行下面的代码来训练数据集上的逻辑回归分类器。

# Train the logistic regression classifier
clf = sklearn.linear_model.LogisticRegressionCV();
clf.fit(X.T, Y.T);

3.1 绘制这些模型的决策边界

# Plot the decision boundary for logistic regression
plot_decision_boundary(lambda x: clf.predict(x), X, Y)
plt.title("Logistic Regression") # Print accuracy
LR_predictions = clf.predict(X.T)
print ('Accuracy of logistic regression: %d ' % float((np.dot(Y,LR_predictions) + np.dot(1-Y,1-LR_predictions))/float(Y.size)*100) +
'% ' + "(percentage of correctly labelled datapoints)")
Accuracy of logistic regression: 47 % (percentage of correctly labelled datapoints)
aaarticlea/png;base64,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" alt="" />

解释:数据集不是线性可分的,所以逻辑回归不表现良好。希望一个神经网络能做得更好。现在让我们试试这个!

4 - Neural Network model(神经网络模型)

Logistic回归在“flower dataset”上效果不佳。你要训练一个只有一个隐藏层的神经网络

Here is our model:

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

Mathematically:

For one example x(i):

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

Given the predictions on all the examples, you can also compute the cost as follows:

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

提醒:建立神经网络的一般方法是:

  1.  定义神经网络结构(神经网络的输入单元,隐藏单元,输出单元等)
  2. 随机初始化模型的参数
  3. 循环:
    • 实现前向传播
    • 计算损失值
    • 实现后向传播来获得梯度值
    • 更新参数(梯度下降)

构建helper函数来计算步骤1-3,然后融合他们为一个 nn_model()函数。学习正确的参数,你可以在新数据上做出预测。

4.1 - Defining the neural network structure

Exercise: Define three variables:

  • n_x: 输入层的大小
  • n_h: 隐藏层的大小(设置为4)
  • n_y: 输出层的大小

Hint: 使用X 和 Y 的维度来计算 n_x, n_y。隐藏层大小设置为4

# GRADED FUNCTION: layer_sizes

def layer_sizes(X, Y):
"""
Arguments:
X -- input dataset of shape (input size, number of examples)
Y -- labels of shape (output size, number of examples) Returns:
n_x -- the size of the input layer
n_h -- the size of the hidden layer
n_y -- the size of the output layer
"""
### START CODE HERE ### (≈ 3 lines of code) n_x = X.shape[0] # size of input layer
n_h = 4
n_y = Y.shape[0] # size of output layer ### END CODE HERE ###
return (n_x, n_h, n_y)
X_assess, Y_assess = layer_sizes_test_case()
(n_x, n_h, n_y) = layer_sizes(X_assess, Y_assess)
print("The size of the input layer is: n_x = " + str(n_x))
print("The size of the hidden layer is: n_h = " + str(n_h))
print("The size of the output layer is: n_y = " + str(n_y))
The size of the input layer is: n_x = 5
The size of the hidden layer is: n_h = 4
The size of the output layer is: n_y = 2

Expected Output (these are not the sizes you will use for your network, they are just used to assess the function you've just coded).

n_x 5
n_h 4
n_y 2

4.2 - Initialize the model's parameters(初始化模型参数)

Exercise: Implement the function  initialize_parameters(). 

Instructions:

  • 确认你的参数正确。
  • 使用 随机值初始化权重矩阵
    • 使用:  np.random.randn(a,b) * 0.01  来随机初始化(a, b)维度的矩阵。
  • 偏置向量初始化为零
    • 使用:  np.zeros((a,b))  用 0 初始化(a, b) 维度的矩阵
# GRADED FUNCTION: initialize_parameters

def initialize_parameters(n_x, n_h, n_y):
"""
Argument:
n_x -- size of the input layer
n_h -- size of the hidden layer
n_y -- size of the output layer Returns:
params -- python dictionary containing your parameters:
W1 -- weight matrix of shape (n_h, n_x)
b1 -- bias vector of shape (n_h, 1)
W2 -- weight matrix of shape (n_y, n_h)
b2 -- bias vector of shape (n_y, 1)
""" np.random.seed(2) # we set up a seed so that your output matches ours although the initialization is random. ### START CODE HERE ### (≈ 4 lines of code) W1 = np.random.randn(n_h, n_x) * 0.01
b1 = np.zeros(shape=(n_h, 1))
W2 = np.random.randn(n_y, n_h) * 0.01
b2 = np.zeros(shape=(n_y, 1)) ### END CODE HERE ### assert (W1.shape == (n_h, n_x))
assert (b1.shape == (n_h, 1))
assert (W2.shape == (n_y, n_h))
assert (b2.shape == (n_y, 1)) parameters = {"W1": W1,
"b1": b1,
"W2": W2,
"b2": b2} return parameters
n_x, n_h, n_y = initialize_parameters_test_case()

parameters = initialize_parameters(n_x, n_h, n_y)

print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
W1 = [[-0.00416758 -0.00056267]
[-0.02136196 0.01640271]
[-0.01793436 -0.00841747]
[ 0.00502881 -0.01245288]]
b1 = [[ 0.]
[ 0.]
[ 0.]
[ 0.]]
W2 = [[-0.01057952 -0.00909008 0.00551454 0.02292208]]
b2 = [[ 0.]]

Expected Output:

W1 [[-0.00416758 -0.00056267] [-0.02136196 0.01640271] [-0.01793436 -0.00841747] [ 0.00502881 -0.01245288]]
b1 [[ 0.] [ 0.] [ 0.] [ 0.]]
W2 [[-0.01057952 -0.00909008 0.00551454 0.02292208]]
b2 [[ 0.]]

4.3 - The Loop

Question: 实现前向传播 forward_propagation().

Instructions:

  • 查看上面的数学公式表示你的分类器
  • 使用  sigmoid()
  • 你可以使用 function  np.tanh() . 这是 numpy库的一部分
  • 这些步骤你必须实现:
    1. 从字典 "parameters" (initialize_parameters()的输出)检索每个参数,用 parameters["..."]。
    2. 实现前向传播。计算:Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类) (所有训练集样本预测的向量)
  • 反向传播所需的值存储在“cache”。cache将作为反向传播函数的输入。
# GRADED FUNCTION: forward_propagation

def forward_propagation(X, parameters):
"""
Argument:
X -- input data of size (n_x, m)
parameters -- python dictionary containing your parameters (output of initialization function) Returns:
A2 -- The sigmoid output of the second activation
cache -- a dictionary containing "Z1", "A1", "Z2" and "A2"
"""
# Retrieve each parameter from the dictionary "parameters"
### START CODE HERE ### (≈ 4 lines of code)
W1 = parameters["W1"]
b1 = parameters["b1"]
W2 = parameters["W2"]
b2 = parameters["b2"]
### END CODE HERE ### # Implement Forward Propagation to calculate A2 (probabilities)
### START CODE HERE ### (≈ 4 lines of code)
Z1 = np.dot(W1, X) + b1
A1 = np.tanh(Z1)
Z2 = np.dot(W2, A1) + b2
A2 = sigmoid(Z2) # print (W1.shape)
# print (X.shape)
# print (b1.shape)
# print ("A1:", A1.shape)
# print ("Z1:",Z1.shape)
# print ("Z2:", Z2.shape)
# print ("A2:", A2.shape) ### END CODE HERE ### assert(A2.shape == (1, X.shape[1])) cache = {"Z1": Z1,
"A1": A1,
"Z2": Z2,
"A2": A2} return A2, cache
X_assess, parameters = forward_propagation_test_case()
A2, cache = forward_propagation(X_assess, parameters) # Note: we use the mean here just to make sure that your output matches ours.
print(np.mean(cache['Z1']) ,np.mean(cache['A1']),np.mean(cache['Z2']),np.mean(cache['A2']))

Expected Output:

0.262818640198 0.091999045227 -1.30766601287 0.212877681719

现在你已经计算Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)(在Python变量“A2”中),其中包含了每个示例的Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类),你可以如下计算代价函数

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

Exercise: Implement  compute_cost()  to compute the value of the cost J.

Instructions:

  • 实现交叉熵损失(cross-entropy loss)的方法有很多种。我们如何实现Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)
logprobs = np.multiply(np.log(A2),Y)
cost = - np.sum(logprobs) # no need to use a for loop!
# GRADED FUNCTION: compute_cost

def compute_cost(A2, Y, parameters):
"""
Computes the cross-entropy cost given in equation (13) Arguments:
A2 -- The sigmoid output of the second activation, of shape (1, number of examples)
Y -- "true" labels vector of shape (1, number of examples)
parameters -- python dictionary containing your parameters W1, b1, W2 and b2 Returns:
cost -- cross-entropy cost given equation (13)
""" m = Y.shape[1] # number of example # Compute the cross-entropy cost
### START CODE HERE ### (≈ 2 lines of code)
logprobs = np.multiply(np.log(A2), Y) + np.multiply(np.log(1 - A2), 1 - Y)
cost = - np.sum(logprobs) / m
### END CODE HERE ### cost = np.squeeze(cost) # makes sure cost is the dimension we expect.
# E.g., turns [[17]] into 17
assert(isinstance(cost, float)) return cost
A2, Y_assess, parameters = compute_cost_test_case()

print("cost = " + str(compute_cost(A2, Y_assess, parameters)))
cost = 0.692919893776

Expected Output:

cost 0.693058761...
使用前向传播期间的cache, 现在可以实现反向传播。

Question: Implement the function  backward_propagation(). 

Instructions: 下面提供6个公式矢量化的实现。

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

Tips: 

计算 dZ1,你需要计算 Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)。由于Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)是一个 tanh 激励函数,如果 Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

所以你可以用(1 - np.power(A1, 2)) 计算 Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

# GRADED FUNCTION: backward_propagation

def backward_propagation(parameters, cache, X, Y):
"""
Implement the backward propagation using the instructions above. Arguments:
parameters -- python dictionary containing our parameters
cache -- a dictionary containing "Z1", "A1", "Z2" and "A2".
X -- input data of shape (2, number of examples)
Y -- "true" labels vector of shape (1, number of examples) Returns:
grads -- python dictionary containing your gradients with respect to different parameters
"""
m = X.shape[1] # First, retrieve W1 and W2 from the dictionary "parameters".
### START CODE HERE ### (≈ 2 lines of code)
W1 = parameters["W1"]
W2 = parameters["W2"]
### END CODE HERE ### # Retrieve also A1 and A2 from dictionary "cache".
### START CODE HERE ### (≈ 2 lines of code)
A1 = cache["A1"]
A2 = cache["A2"]
### END CODE HERE ### # Backward propagation: calculate dW1, db1, dW2, db2.
### START CODE HERE ### (≈ 6 lines of code, corresponding to 6 equations on slide above)
dZ2 = A2 - Y
dW2 = (1 / m) * np.dot(dZ2, A1.T)
db2 = (1 / m) * np.sum(dZ2, axis=1, keepdims=True)
dZ1 = np.multiply(np.dot(W2.T, dZ2), 1 - np.power(A1, 2))
dW1 = (1 / m) * np.dot(dZ1, X.T)
db1 = (1 / m) * np.sum(dZ1, axis=1, keepdims=True)
### END CODE HERE ### grads = {"dW1": dW1,
"db1": db1,
"dW2": dW2,
"db2": db2} return grads
parameters, cache, X_assess, Y_assess = backward_propagation_test_case()

grads = backward_propagation(parameters, cache, X_assess, Y_assess)
print ("dW1 = "+ str(grads["dW1"]))
print ("db1 = "+ str(grads["db1"]))
print ("dW2 = "+ str(grads["dW2"]))
print ("db2 = "+ str(grads["db2"]))
dW1 = [[ 0.01018708 -0.00708701]
[ 0.00873447 -0.0060768 ]
[-0.00530847 0.00369379]
[-0.02206365 0.01535126]]
db1 = [[-0.00069728]
[-0.00060606]
[ 0.000364 ]
[ 0.00151207]]
dW2 = [[ 0.00363613 0.03153604 0.01162914 -0.01318316]]
db2 = [[ 0.06589489]]

Expected output:

dW1 [[ 0.01018708 -0.00708701] [ 0.00873447 -0.0060768 ] [-0.00530847 0.00369379] [-0.02206365 0.01535126]]
db1 [[-0.00069728] [-0.00060606] [ 0.000364 ] [ 0.00151207]]
dW2 [[ 0.00363613 0.03153604 0.01162914 -0.01318316]]
db2 [[ 0.06589489]]

Question: 执行更新参数规则。使用梯度下降算法。你不得不使用 (dW1, db1, dW2, db2) 来更新 (W1, b1, W2, b2).

一般梯度下降规则:Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)。(α 是learning rate;θ 表示参数)

Illustration: 梯度下降算法具有良好的学习速率(收敛) 和 差的学习速率(发散)。图片如下:.

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

# GRADED FUNCTION: update_parameters

def update_parameters(parameters, grads, learning_rate = 1.2):
"""
Updates parameters using the gradient descent update rule given above Arguments:
parameters -- python dictionary containing your parameters
grads -- python dictionary containing your gradients Returns:
parameters -- python dictionary containing your updated parameters
"""
# Retrieve each parameter from the dictionary "parameters"
### START CODE HERE ### (≈ 4 lines of code)
W1 = parameters["W1"]
b1 = parameters["b1"]
W2 = parameters["W2"]
b2 = parameters["b2"]
### END CODE HERE ### # Retrieve each gradient from the dictionary "grads"
### START CODE HERE ### (≈ 4 lines of code)
dW1 = grads["dW1"]
db1 = grads["db1"]
dW2 = grads["dW2"]
db2 = grads["db2"]
## END CODE HERE ### # Update rule for each parameter
### START CODE HERE ### (≈ 4 lines of code)
W1 = W1 - learning_rate * dW1
b1 = b1 - learning_rate * db1
W2 = W2 - learning_rate * dW2
b2 = b2 - learning_rate * db2
### END CODE HERE ### parameters = {"W1": W1,
"b1": b1,
"W2": W2,
"b2": b2} return parameters
parameters, grads = update_parameters_test_case()
parameters = update_parameters(parameters, grads) print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
W1 = [[-0.00643025  0.01936718]
[-0.02410458 0.03978052]
[-0.01653973 -0.02096177]
[ 0.01046864 -0.05990141]]
b1 = [[ -1.02420756e-06]
[ 1.27373948e-05]
[ 8.32996807e-07]
[ -3.20136836e-06]]
W2 = [[-0.01041081 -0.04463285 0.01758031 0.04747113]]
b2 = [[ 0.00010457]]

Expected Output:

W1 [[-0.00643025 0.01936718] [-0.02410458 0.03978052] [-0.01653973 -0.02096177] [ 0.01046864 -0.05990141]]
b1 [[ -1.02420756e-06] [ 1.27373948e-05] [ 8.32996807e-07] [ -3.20136836e-06]]
W2 [[-0.01041081 -0.04463285 0.01758031 0.04747113]]
b2 [[ 0.00010457]]

4.4 - Integrate parts 4.1, 4.2 and 4.3 in nn_model()

Question: 在 nn_model() 里构建神经网络模型

Instructions: 神经网络模型必须按照正确的顺序使用前面的函数。

# GRADED FUNCTION: nn_model

def nn_model(X, Y, n_h, num_iterations=10000, print_cost=False):
"""
Arguments:
X -- dataset of shape (2, number of examples)
Y -- labels of shape (1, number of examples)
n_h -- size of the hidden layer
num_iterations -- Number of iterations in gradient descent loop
print_cost -- if True, print the cost every 1000 iterations Returns:
parameters -- parameters learnt by the model. They can then be used to predict.
""" np.random.seed(3)
n_x = layer_sizes(X, Y)[0]
n_y = layer_sizes(X, Y)[2] # Initialize parameters, then retrieve W1, b1, W2, b2. Inputs: "n_x, n_h, n_y". Outputs = "W1, b1, W2, b2, parameters".
### START CODE HERE ### (≈ 5 lines of code)
parameters = initialize_parameters(n_x, n_h, n_y)
W1 = parameters['W1']
b1 = parameters['b1']
W2 = parameters['W2']
b2 = parameters['b2']
### END CODE HERE ### # Loop (gradient descent) for i in range(0, num_iterations): ### START CODE HERE ### (≈ 4 lines of code)
# Forward propagation. Inputs: "X, parameters". Outputs: "A2, cache".
A2, cache = forward_propagation(X, parameters) # Cost function. Inputs: "A2, Y, parameters". Outputs: "cost".
cost = compute_cost(A2, Y, parameters) # Backpropagation. Inputs: "parameters, cache, X, Y". Outputs: "grads".
grads = backward_propagation(parameters, cache, X, Y) # Gradient descent parameter update. Inputs: "parameters, grads". Outputs: "parameters".
parameters = update_parameters(parameters, grads) ### END CODE HERE ### # Print the cost every 1000 iterations
if print_cost and i % 1000 == 0:
print ("Cost after iteration %i: %f" % (i, cost)) return parameters
X_assess, Y_assess = nn_model_test_case()

parameters = nn_model(X_assess, Y_assess, 4, num_iterations=10000, print_cost=True)
print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))

Expected Output:

W1 [[-4.18494056 5.33220609] [-7.52989382 1.24306181] [-4.1929459 5.32632331] [ 7.52983719 -1.24309422]]
b1 [[ 2.32926819] [ 3.79458998] [ 2.33002577] [-3.79468846]]
W2 [[-6033.83672146 -6008.12980822 -6033.10095287 6008.06637269]]
b2 [[-52.66607724]]

4.5 - Predictions

Question: 使用您的模型通过构建 predict()来进行预测。使用前向传播来预测结果。.

Reminder:

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

例如,如果要根据阈值将 matrix X 条目设置为 0 和 1,则需要执行以下操作: X_new = (X > threshold)

# GRADED FUNCTION: predict

def predict(parameters, X):
"""
Using the learned parameters, predicts a class for each example in X Arguments:
parameters -- python dictionary containing your parameters
X -- input data of size (n_x, m) Returns
predictions -- vector of predictions of our model (red: 0 / blue: 1)
""" # Computes probabilities using forward propagation, and classifies to 0/1 using 0.5 as the threshold.
### START CODE HERE ### (≈ 2 lines of code)
A2, cache = forward_propagation(X, parameters)
predictions = np.round(A2)
### END CODE HERE ### return predictions
parameters, X_assess = predict_test_case()

predictions = predict(parameters, X_assess)
print("predictions mean = " + str(np.mean(predictions)))

Expected Output:

predictions mean 0.666666666667

使用单个隐藏层,n_h个隐藏单元测试模型。

# Build a model with a n_h-dimensional hidden layer
parameters = nn_model(X, Y, n_h = 4, num_iterations = 10000, print_cost=True) # Plot the decision boundary
plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y)
plt.title("Decision Boundary for hidden layer size " + str(4))
Cost after iteration 0: 0.693048
Cost after iteration 1000: 0.288083
Cost after iteration 2000: 0.254385
Cost after iteration 3000: 0.233864
Cost after iteration 4000: 0.226792
Cost after iteration 5000: 0.222644
Cost after iteration 6000: 0.219731
Cost after iteration 7000: 0.217504
Cost after iteration 8000: 0.219440
Cost after iteration 9000: 0.218553

Expected Output:

Cost after iteration 9000 0.218607

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

# Print accuracy
predictions = predict(parameters, X)
print ('Accuracy: %d' % float((np.dot(Y,predictions.T) + np.dot(1-Y,1-predictions.T))/float(Y.size)*100) + '%')

Expected Output:

Accuracy 90%

与Logistic回归相比,准确性很高。这个模型已经学会了花的叶子图案!与Logistic回归不同,神经网络甚至能够学习高度非线性的决策边界.现在,让我们尝试几个隐藏层的大小。

4.6 - Tuning hidden layer size (optional/ungraded exercise)(调整隐藏层大小)

您将观察不同隐藏层大小的模型的不同行为。

# This may take about 2 minutes to run

plt.figure(figsize=(16, 32))  # 设置图像大小
hidden_layer_sizes = [1, 2, 3, 4, 5, 20, 50]
for i, n_h in enumerate(hidden_layer_sizes):
plt.subplot(5, 2, i+1)
plt.title('Hidden Layer of size %d' % n_h)
parameters = nn_model(X, Y, n_h, num_iterations = 5000)
plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y)
predictions = predict(parameters, X)
accuracy = float((np.dot(Y,predictions.T) + np.dot(1-Y,1-predictions.T))/float(Y.size)*100)
print ("Accuracy for {} hidden units: {} %".format(n_h, accuracy))
Accuracy for 1 hidden units: 67.5 %
Accuracy for 2 hidden units: 67.25 %
Accuracy for 3 hidden units: 90.75 %
Accuracy for 4 hidden units: 90.5 %
Accuracy for 5 hidden units: 91.25 %
Accuracy for 20 hidden units: 90.5 %
Accuracy for 50 hidden units: 90.75 %

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

Interpretation:

  • 较大的模型(有更多的隐藏单元)能够更好地适应训练集。直到最终最大的模型过拟合数据。
  • 最好的隐藏层大小似乎在n_h=5左右。实际上,这里似乎与数据很好的吻合。同时也不好引起明显的过拟合。
  • 稍后你还能了解正则化(regularization),他允许你使用非常大的模型(例如n_h = 50),而且没有太多过拟合。

Optional questions:

  • 可以将tanh激活函数改成 sigmoid() 和 relu 激活函数时,会发生什么?
  • 修改学习率(learning rate)
  • 如果更改数据集怎么办?

你已经学会了:

  • 建立一个完整的隐藏神经网络
  • 充分利用一个非线性单元实现前向传播和反向传播,并训练一个神经网络
  • 看看改变隐层大小的影响,包括过拟合。

5 - Performance on other datasets

如果需要,可以为下列每个数据集重新运行整个notebook(减去DataSet部分)。

# Datasets
noisy_circles, noisy_moons, blobs, gaussian_quantiles, no_structure = load_extra_datasets() datasets = {"noisy_circles": noisy_circles,
"noisy_moons": noisy_moons,
"blobs": blobs,
"gaussian_quantiles": gaussian_quantiles} ### START CODE HERE ### (choose your dataset)
dataset = "noisy_moons"
### END CODE HERE ### X, Y = datasets[dataset]
X, Y = X.T, Y.reshape(1, Y.shape[0]) # make blobs binary
if dataset == "blobs":
Y = Y % 2 # Visualize the data
plt.scatter(X[0, :], X[1, :], c=Y.reshape(200), s=40, cmap=plt.cm.Spectral);

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)

parameters = nn_model(X, Y, n_h=5, num_iterations = 5000)
plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y) predictions = predict(parameters, X)
accuracy = float((np.dot(Y,predictions.T) + np.dot(1-Y,1-predictions.T))/float(Y.size)*100)
print("Accuracy: ", accuracy)

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)