当前位置: 代码迷 >> 综合 >> 吴恩达 deeplearning.ai - 神经网络和深度学习 - 第三周代码
  详细解决方案

吴恩达 deeplearning.ai - 神经网络和深度学习 - 第三周代码

热度:14   发布时间:2023-11-11 06:43:44.0

参考链接:https://blog.csdn.net/u013733326/article/details/79702148

准备软件包

我们需要准备一些软件包:

  • numpy:是用Python进行科学计算的基本软件包。
  • sklearn:为数据挖掘和数据分析提供的简单高效的工具。
  • matplotlib :是一个用于在Python中绘制图表的库。
  • testCases:提供了一些测试示例来评估函数的正确性,参见下载的资料或者在底部查看它的代码。
  • planar_utils :提供了在这个任务中使用的各种有用的功能,参见下载的资料或者在底部查看它的代码。
# 准备软件包
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 #如果你使用用的是Jupyter Notebook的话请取消注释。np.random.seed(1) #设置一个固定的随机种子,以保证接下来的步骤中我们的结果是一致的。
输出:
UsageError: unrecognized arguments: #如果你使用用的是Jupyter Notebook的话请取消注释。

加载和查看数据集

#查看数据集
X, Y = load_planar_dataset()#可视化数据集
plt.scatter(X[0, :], X[1, :], c=Y, s=40, cmap=plt.cm.Spectral) #绘制散点图# 上一语句如出现问题,请使用下面的语句:
# plt.scatter(X[0, :], X[1, :], c=np.squeeze(Y), s=40, cmap=plt.cm.Spectral) #绘制散点图
输出:
<matplotlib.collections.PathCollection at 0x1ab3d993a08>

png

数据看起来像一朵红色(y = 0)和一些蓝色(y = 1)的数据点的花朵的图案。 我们的目标是建立一个模型来适应这些数据。现在,我们已经有了以下的东西:

  • X:一个numpy的矩阵,包含了这些数据点的数值
  • Y:一个numpy的向量,对应着的是X的标签【0 | 1】(红色:0 , 蓝色 :1)
#查看数据类型
shape_X = X.shape
shape_Y = Y.shape
m = Y.shape[1]  # 训练集里面的数量print ("X的维度为: " + str(shape_X))
print ("Y的维度为: " + str(shape_Y))
print ("数据集里面的数据有:" + str(m) + " 个")
输出:
X的维度为: (2, 400)
Y的维度为: (1, 400)
数据集里面的数据有:400 个

查看简单的Logistic回归的分类效果

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

# 构建Logistic回归模型,同时进行模型训练
clf = sklearn.linear_model.LogisticRegressionCV()
clf.fit(X.T,Y.T)
输出:
LogisticRegressionCV()
# 绘制分类效果
plot_decision_boundary(lambda x: clf.predict(x), X, Y) #绘制决策边界
plt.title("Logistic Regression") #图标题
LR_predictions  = clf.predict(X.T) #预测结果
print ("逻辑回归的准确性: %d " % float((np.dot(Y, LR_predictions) + np.dot(1 - Y,1 - LR_predictions)) / float(Y.size) * 100) +"% " + "(正确标记的数据点所占的百分比)") # 正例和反例预测之和与总数做除法得到百分比
输出:
逻辑回归的准确性: 47 % (正确标记的数据点所占的百分比)

png

准确性只有47%的原因是数据集不是线性可分的,所以逻辑回归表现不佳,现在我们正式开始构建神经网络。

搭建神经网络

构建神经网络的一般方法是:

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

我们要它们合并到一个nn_model() 函数中,当我们构建好了nn_model()并学习了正确的参数,我们就可以预测新的数据。

定义神经网络结构

在构建之前,我们要先把神经网络的结构给定义好:

  • n_x: 输入层的数量
  • n_h: 隐藏层的数量(这里设置为4)
  • n_y: 输出层的数量
def layer_sizes(X , Y):"""参数:X - 输入数据集,维度为(输入的数量,训练/测试的数量)Y - 标签,维度为(输出的数量,训练/测试数量)返回:n_x - 输入层的数量n_h - 隐藏层的数量n_y - 输出层的数量"""n_x = X.shape[0] #输入层n_h = 4 #,隐藏层,硬编码为4n_y = Y.shape[0] #输出层return (n_x,n_h,n_y)
# 测试神经网络结构
print("=========================测试layer_sizes=========================")
X_asses , Y_asses = layer_sizes_test_case() #随机初始化X_asses和Y_asses
(n_x,n_h,n_y) =  layer_sizes(X_asses,Y_asses)
print("输入层的节点数量为: n_x = " + str(n_x))
print("隐藏层的节点数量为: n_h = " + str(n_h))
print("输出层的节点数量为: n_y = " + str(n_y))
输出:
=========================测试layer_sizes=========================
输入层的节点数量为: n_x = 5
隐藏层的节点数量为: n_h = 4
输出层的节点数量为: n_y = 2

初始化模型的参数

在这里,我们要实现函数initialize_parameters()。我们要确保我们的参数大小合适,如果需要的话,请参考上面的神经网络图。

我们将会用随机值初始化权重矩阵。

  • np.random.randn(a,b)* 0.01来随机初始化一个维度为(a,b)的矩阵。

将偏向量初始化为零。

  • np.zeros((a,b))用零初始化矩阵(a,b)。
def initialize_parameters( n_x , n_h ,n_y):"""参数:n_x - 输入层节点的数量n_h - 隐藏层节点的数量n_y - 输出层节点的数量返回:parameters - 包含参数的字典:W1 - 权重矩阵,维度为(n_h,n_x)b1 - 偏向量,维度为(n_h,1)W2 - 权重矩阵,维度为(n_y,n_h)b2 - 偏向量,维度为(n_y,1)"""np.random.seed(2) #指定一个随机种子,以便你的输出与我们的一样。# 随机初始化权重W1 = np.random.randn(n_h,n_x) * 0.01b1 = np.zeros(shape=(n_h, 1))W2 = np.random.randn(n_y,n_h) * 0.01b2 = np.zeros(shape=(n_y, 1))#使用断言确保我的数据格式是正确的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
#测试initialize_parameters
print("=========================测试initialize_parameters=========================")    
n_x , n_h , n_y = initialize_parameters_test_case() #n_x, n_h, n_y = 2, 4, 1
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"]))
输出:
=========================测试initialize_parameters=========================
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.]]

循环

前向传播

def forward_propagation( X , parameters ):"""参数:X - 维度为(n_x,m)的输入数据。parameters - 初始化函数(initialize_parameters)的输出返回:A2 - 使用sigmoid()函数计算的第二次激活后的数值cache - 包含“Z1”,“A1”,“Z2”和“A2”的字典类型变量"""# 获得权重矩阵W1 = parameters["W1"]b1 = parameters["b1"]W2 = parameters["W2"]b2 = parameters["b2"]# 前向传播计算A2Z1 = np.dot(W1 , X) + b1A1 = np.tanh(Z1)Z2 = np.dot(W2 , A1) + b2A2 = sigmoid(Z2)# 使用断言确保我的数据格式是正确的assert(A2.shape == (1,X.shape[1]))# 整合结果cache = {
    "Z1": Z1,"A1": A1,"Z2": Z2,"A2": A2}return (A2, cache)
#测试forward_propagation
print("=========================测试forward_propagation=========================") 
X_assess, parameters = forward_propagation_test_case()
A2, cache = forward_propagation(X_assess, parameters)
print(np.mean(cache["Z1"]), np.mean(cache["A1"]), np.mean(cache["Z2"]), np.mean(cache["A2"]))
输出:
=========================测试forward_propagation=========================
-0.0004997557777419902 -0.000496963353231779 0.00043818745095914653 0.500109546852431

计算损失

# logprobs = np.multiply(np.log(A2),Y)
# cost = - np.sum(logprobs) # 不需要使用循环就可以直接算出来。
def compute_cost(A2,Y,parameters):"""计算方程(6)中给出的交叉熵成本,参数:A2 - 使用sigmoid()函数计算的第二次激活后的数值Y - "True"标签向量,维度为(1,数量)parameters - 一个包含W1,B1,W2和B2的字典类型的变量返回:成本 - 交叉熵成本给出方程(13)"""m = Y.shape[1]  #样本数目# 获得群众W1 = parameters["W1"]W2 = parameters["W2"]#计算成本logprobs = np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2))cost = - np.sum(logprobs) / m #求平均值cost = float(np.squeeze(cost)) #转化为float类型# 判断交叉熵成本是否是浮点数assert(isinstance(cost,float))return cost
#测试compute_cost
print("=========================测试compute_cost=========================") 
A2 , Y_assess , parameters = compute_cost_test_case()
print("cost = " + str(compute_cost(A2,Y_assess,parameters)))
输出:
=========================测试compute_cost=========================
cost = 0.6929198937761266

向后传播

def backward_propagation(parameters,cache,X,Y):"""使用上述说明搭建反向传播函数。参数:parameters - 包含我们的参数的一个字典类型的变量。cache - 包含“Z1”,“A1”,“Z2”和“A2”的字典类型的变量。X - 输入数据,维度为(2,数量)Y - “True”标签,维度为(1,数量)返回:grads - 包含W和b的导数一个字典类型的变量。"""# 获取样本数量m = X.shape[1]# 获得权重矩阵W1 = parameters["W1"]W2 = parameters["W2"]#获得各层的输出A1 = cache["A1"]A2 = cache["A2"]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)# 得到每层的偏导数grads = {
    "dW1": dW1,"db1": db1,"dW2": dW2,"db2": db2 }return grads
#测试backward_propagation
print("=========================测试backward_propagation=========================")
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"]))
输出:
=========================测试backward_propagation=========================
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]]

更新参数

def update_parameters(parameters,grads,learning_rate=1.2):"""使用上面给出的梯度下降更新规则更新参数参数:parameters - 包含参数的字典类型的变量。grads - 包含导数值的字典类型的变量。learning_rate - 学习速率返回:parameters - 包含更新参数的字典类型的变量。"""# 获取权重W1,W2 = parameters["W1"],parameters["W2"]b1,b2 = parameters["b1"],parameters["b2"]# 获取所有的导数dW1,dW2 = grads["dW1"],grads["dW2"]db1,db2 = grads["db1"],grads["db2"]# 更新权重W1 = W1 - learning_rate * dW1b1 = b1 - learning_rate * db1W2 = W2 - learning_rate * dW2b2 = b2 - learning_rate * db2parameters = {
    "W1": W1,"b1": b1,"W2": W2,"b2": b2}return parameters
#测试update_parameters
print("=========================测试update_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"]))
输出:
=========================测试update_parameters=========================
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]]

整合

我们现在把上面的东西整合到nn_model()中,神经网络模型必须以正确的顺序使用先前的功能。

def nn_model(X,Y,n_h,num_iterations,print_cost=False):"""参数:X - 数据集,维度为(2,示例数)Y - 标签,维度为(1,示例数)n_h - 隐藏层的数量num_iterations - 梯度下降循环中的迭代次数print_cost - 如果为True,则每1000次迭代打印一次成本数值返回:parameters - 模型学习的参数,它们可以用来进行预测。"""np.random.seed(3) #指定随机种子n_x = layer_sizes(X, Y)[0] #输入层n_y = layer_sizes(X, Y)[2] #输出层#初始化权重parameters = initialize_parameters(n_x,n_h,n_y)W1 = parameters["W1"]b1 = parameters["b1"]W2 = parameters["W2"]b2 = parameters["b2"]#进行梯度下降for i in range(num_iterations):A2 , cache = forward_propagation(X,parameters) #前向传播cost = compute_cost(A2,Y,parameters) #计算代价函数值grads = backward_propagation(parameters,cache,X,Y) #进行反向传播parameters = update_parameters(parameters,grads,learning_rate = 0.5) #更新梯度#判断是否输出if print_cost:if i%1000 == 0:print("第 ",i," 次循环,成本为:"+str(cost))return parameters
#测试nn_model
print("=========================测试nn_model=========================")
X_assess, Y_assess = nn_model_test_case()parameters = nn_model(X_assess, Y_assess, 4, num_iterations=10000, print_cost=False)
print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
输出:
=========================测试nn_model=========================
W1 = [[-3.89167767  4.77541602][-6.77960338  1.20272585][-3.88338966  4.78028666][ 6.77958203 -1.20272574]]
b1 = [[ 2.11530892][ 3.41221357][ 2.11585732][-3.41221322]]
W2 = [[-2512.9093032  -2502.70799785 -2512.01655969  2502.65264416]]
b2 = [[-22.29071761]]

预测

构建predict()来使用模型进行预测, 使用向前传播来预测结果。

def predict(parameters,X):"""使用学习的参数,为X中的每个示例预测一个类参数:parameters - 包含参数的字典类型的变量。X - 输入数据(n_x,m)返回predictions - 我们模型预测的向量(红色:0 /蓝色:1)"""# 将传入的数据与权重进行一次前向传播可以得到预测的值A2 , cache = forward_propagation(X, parameters)predictions = np.round(A2) # 以0.5为界限,来进行预测return predictions
#测试predict
print("=========================测试predict=========================")parameters, X_assess = predict_test_case()predictions = predict(parameters, X_assess)
print("预测的平均值 = " + str(np.mean(predictions)))
输出:
=========================测试predict=========================
预测的平均值 = 0.6666666666666666

正式运行

parameters = nn_model(X, Y, n_h = 4, num_iterations=10000, print_cost=True)#绘制边界
plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y)
plt.title("Decision Boundary for hidden layer size " + str(4))predictions = predict(parameters, X)
print ('准确率: %d' % float((np.dot(Y, predictions.T) + np.dot(1 - Y, 1 - predictions.T)) / float(Y.size) * 100) + '%')
输出:
第  0  次循环,成本为:0.6930480201239823
第  1000  次循环,成本为:0.3098018601352803
第  2000  次循环,成本为:0.2924326333792646
第  3000  次循环,成本为:0.2833492852647412
第  4000  次循环,成本为:0.27678077562979253
第  5000  次循环,成本为:0.26347155088593144
第  6000  次循环,成本为:0.24204413129940763
第  7000  次循环,成本为:0.23552486626608762
第  8000  次循环,成本为:0.23140964509854278
第  9000  次循环,成本为:0.22846408048352365
准确率: 90%

png

更改隐藏层节点数量

我们上面的实验把隐藏层定为4个节点,现在我们更改隐藏层里面的节点数量,看一看节点数量是否会对结果造成影响。

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 ("隐藏层的节点数量: {} ,准确率: {} %".format(n_h, accuracy))
输出:
隐藏层的节点数量: 1  ,准确率: 67.25 %
隐藏层的节点数量: 2  ,准确率: 66.5 %
隐藏层的节点数量: 3  ,准确率: 89.25 %
隐藏层的节点数量: 4  ,准确率: 90.0 %
隐藏层的节点数量: 5  ,准确率: 89.75 %
隐藏层的节点数量: 20  ,准确率: 90.0 %
隐藏层的节点数量: 50  ,准确率: 89.75 %

png

较大的模型(具有更多隐藏单元)能够更好地适应训练集,直到最终的最大模型过度拟合数据。

最好的隐藏层大小似乎在n_h = 5附近。实际上,这里的值似乎很适合数据,而且不会引起过度拟合。

我们还将在后面学习有关正则化的知识,它允许我们使用非常大的模型(如n_h = 50),而不会出现太多过度拟合。

改变learning_rate的数值会发生什么

更改0.5的学习率为0.1

def nn_model(X,Y,n_h,num_iterations,print_cost=False):"""参数:X - 数据集,维度为(2,示例数)Y - 标签,维度为(1,示例数)n_h - 隐藏层的数量num_iterations - 梯度下降循环中的迭代次数print_cost - 如果为True,则每1000次迭代打印一次成本数值返回:parameters - 模型学习的参数,它们可以用来进行预测。"""np.random.seed(3) #指定随机种子n_x = layer_sizes(X, Y)[0] #输入层n_y = layer_sizes(X, Y)[2] #输出层#初始化权重parameters = initialize_parameters(n_x,n_h,n_y)W1 = parameters["W1"]b1 = parameters["b1"]W2 = parameters["W2"]b2 = parameters["b2"]#进行梯度下降for i in range(num_iterations):A2 , cache = forward_propagation(X,parameters) #前向传播cost = compute_cost(A2,Y,parameters) #计算代价函数值grads = backward_propagation(parameters,cache,X,Y) #进行反向传播parameters = update_parameters(parameters,grads,learning_rate = 0.1) #更新梯度#判断是否输出if print_cost:if i%1000 == 0:print("第 ",i," 次循环,成本为:"+str(cost))return parameters
parameters = nn_model(X, Y, n_h = 4, num_iterations=10000, print_cost=True)#绘制边界
plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y)
plt.title("Decision Boundary for hidden layer size " + str(4))predictions = predict(parameters, X)
print ('准确率: %d' % float((np.dot(Y, predictions.T) + np.dot(1 - Y, 1 - predictions.T)) / float(Y.size) * 100) + '%')
输出:
第  0  次循环,成本为:0.6930480201239823
第  1000  次循环,成本为:0.6082072899772629
第  2000  次循环,成本为:0.36073810801711914
第  3000  次循环,成本为:0.3290211712344614
第  4000  次循环,成本为:0.3169254361704178
第  5000  次循环,成本为:0.3097334282605931
第  6000  次循环,成本为:0.3046867806714765
第  7000  次循环,成本为:0.3008037341117686
第  8000  次循环,成本为:0.29763181251528925
第  9000  次循环,成本为:0.2949307617619345
准确率: 89%

png

如果我们改变数据集呢?

# 数据集
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}dataset = "noisy_moons"X, Y = datasets[dataset]
X, Y = X.T, Y.reshape(1, Y.shape[0])if dataset == "blobs":Y = Y % 2plt.scatter(X[0, :], X[1, :], c=Y, s=40, cmap=plt.cm.Spectral)#上一语句如出现问题请使用下面的语句:
plt.scatter(X[0, :], X[1, :], c=np.squeeze(Y), s=40, cmap=plt.cm.Spectral)
输出:
<matplotlib.collections.PathCollection at 0x1ab3f620388>

png

planar_utils.py

import matplotlib.pyplot as plt
import numpy as np
import sklearn
import sklearn.datasets
import sklearn.linear_modeldef plot_decision_boundary(model, X, y):# Set min and max values and give it some paddingx_min, x_max = X[0, :].min() - 1, X[0, :].max() + 1y_min, y_max = X[1, :].min() - 1, X[1, :].max() + 1h = 0.01# Generate a grid of points with distance h between themxx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))# Predict the function value for the whole gridZ = model(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)# Plot the contour and training examplesplt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)plt.ylabel('x2')plt.xlabel('x1')plt.scatter(X[0, :], X[1, :], c=y, cmap=plt.cm.Spectral)def sigmoid(x):s = 1/(1+np.exp(-x))return sdef load_planar_dataset():np.random.seed(1)m = 400 # number of examplesN = int(m/2) # number of points per classD = 2 # dimensionalityX = np.zeros((m,D)) # data matrix where each row is a single exampleY = np.zeros((m,1), dtype='uint8') # labels vector (0 for red, 1 for blue)a = 4 # maximum ray of the flowerfor 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 # thetar = a*np.sin(4*t) + np.random.randn(N)*0.2 # radiusX[ix] = np.c_[r*np.sin(t), r*np.cos(t)]Y[ix] = jX = X.TY = Y.Treturn X, Ydef load_extra_datasets():  N = 200noisy_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

testCases.py

#-*- coding: UTF-8 -*-
""" # WANGZHE12 """
import numpy as npdef 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_assessdef initialize_parameters_test_case():n_x, n_h, n_y = 2, 4, 1return n_x, n_h, n_ydef 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, parametersdef 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, parametersdef 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_assessdef 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, gradsdef 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_assessdef 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
  相关解决方案