NG深度学习第一门课作业2 通过一个隐藏层的神经网络来做平面数据的分类

欢迎来到你的第三周编程作业。是时候建立你的第一个神经网络了,它将有一个隐藏的层。您将会看到这个模型和您使用逻辑回归实现的模型有很大的不同。

在这篇文章中,我们会讲到以下的知识:

  • 构建具有单隐藏层的二分类神经网络。
  • 使用具有非线性激活功能激活函数,例如tanh。
  • 计算交叉熵损失(损失函数)。
  • 实现向前和向后传播。

1-准备软件包

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

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
from functools import reduce
import operator

%matplotlib inline

np.random.seed(1) # 设置一个固定的随机种子,以保证接下来的步骤中我们的结果是一致的

 

2 -数据集

首先,我们来看看我们将要使用的数据集, 下面的代码会将一个花的图案的二类数据集加载到变量X和Y中。

X, Y = load_planar_dataset() 

 把数据集加载完成了,然后使用matplotlib可视化数据集,代码如下:

# Visualize the data:
plt.scatter(X[0, :], X[1, :], c=Y.reshape(-1,), s=40, cmap=plt.cm.Spectral);

结果:

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

X:一个numpy的矩阵,包含了这些数据点的数值
Y:一个numpy的向量,对应着的是X的标签【0 | 1】(红色:0 , 蓝色 :1)

练习:你有多少个训练示例?此外,变量的维度是多少?

### START CODE HERE ### (≈ 3 lines of code)
shape_X = X.shape
shape_Y = Y.shape
m = X.shape[1]  # 训练集里面的数量
### 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!

 

3 -简单逻辑回归

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

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

现在,您可以绘制这些模型的决策边界。运行下面的代码。

# 绘制决策边界
plot_decision_boundary(lambda x: clf.predict(x), X, Y.reshape(-1,))
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)")

结果:(逻辑回归的准确性: 47 % (正确标记的数据点所占的百分比))

Accuracy of logistic regression: 47 % (percentage of correctly labelled datapoints)

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

 

4 -神经网络模型

逻辑回归在“花卉数据集”上效果不佳。你要训练一个只有一个隐藏层的神经网络。

构建神经网络的一般方法是: 
1. 定义神经网络结构(输入单元的数量,隐藏单元的数量等)。 
2. 初始化模型的参数 
3. 循环:

  • 实施前向传播
  • 计算损失
  • 实现反向传播
  • 更新参数(梯度下降)

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

4.1 -定义神经网络结构

练习:定义三个变量:

  • n_x: 输入层的数量
  • n_h: 隐藏层的数量(这里设置为4)
  • n_y: 输出层的数量

提示:使用X和Y的维度来查找n_x和n_y。

# GRADED FUNCTION: layer_sizes

def layer_sizes(X, Y):
    """
    参数:
     X - 输入数据集,维度为(输入的数量,训练/测试的数量)
     Y - 标签,维度为(输出的数量,训练/测试数量)

    返回:
     n_x - 输入层的数量
     n_h - 隐藏层的数量
     n_y - 输出层的数量
    """
    ### START CODE HERE ### (≈ 3 lines of code)
    n_x = X.shape[0]   # 输入层
    n_h = 4            # 隐藏层,硬编码为4
    n_y = Y.shape[0]   # 输出层
    ### 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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值