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);
你有:
- 一个 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:
Mathematically:
For one example x(i):
Given the predictions on all the examples, you can also compute the cost J as follows:
提醒:建立神经网络的一般方法是:
- 定义神经网络结构(神经网络的输入单元,隐藏单元,输出单元等)
- 随机初始化模型的参数
- 循环:
- 实现前向传播
- 计算损失值
- 实现后向传播来获得梯度值
- 更新参数(梯度下降)
构建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).
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库的一部分
- 这些步骤你必须实现:
- 从字典 "parameters" (initialize_parameters()的输出)检索每个参数,用 parameters["..."]。
- 实现前向传播。计算: (所有训练集样本预测的向量)
- 反向传播所需的值存储在“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 |
现在你已经计算(在Python变量“A2”中),其中包含了每个示例的,你可以如下计算代价函数
Exercise: Implement compute_cost() to compute the value of the cost J.
Instructions:
- 实现交叉熵损失(cross-entropy loss)的方法有很多种。我们如何实现
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)))
使用前向传播期间的cache, 现在可以实现反向传播。
Question: Implement the function backward_propagation().
Instructions: 下面提供6个公式矢量化的实现。
Tips:
计算 dZ1,你需要计算 。由于是一个 tanh 激励函数,如果
所以你可以用(1 - np.power(A1, 2)) 计算
。
# 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).
一般梯度下降规则:。(α 是learning rate;θ 表示参数)
Illustration: 梯度下降算法具有良好的学习速率(收敛) 和 差的学习速率(发散)。图片如下:.
# 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:
例如,如果要根据阈值将 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 |
# 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:
与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 %
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);
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)