本文是吴恩达《深度学习》课程的L1W3编程作业,主要也是跟着参考资料里面的博主实现了一遍,也加了一些自己的理解和补充。希望自己早日掌握这些神奇的知识!
我用的环境是天池的notebook
1 实验目标
- 实现具有单个隐藏层的2分类神经网络
- 使用具有非线性激活函数的神经元,例如tanh
- 计算交叉熵损失
- 实现前向和后向传播
2 准备工作
2.1 安装包
python中需要用到的软件包:
- numpy-科学计算
- sklearn-用于数据挖掘和分析
- matplotlib-可视化
课程提供的数据包,资料在第二个参考链接里面博主有提供:
- 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
np.random.seed(1)#设置一个随机种子,以保证接下来的步骤中结果与我一致
2.2 数据集
查看数据集:
- X:一个numpy的矩阵,包含了这些数据点的数值
- Y:一个numpy的向量,对应着的是X的标签【0 | 1】(红色:0 , 蓝色 :1)
X,Y=load_planar_dataset()
plt.scatter(X[0,:],X[1,:],c=Y,s=40,cmap=plt.cm.Spectral)#绘制散点图
3 简单Logistic回归
- 在搭建神经网络之前,先看看之前学的逻辑回归的分类结果怎么样。
- 先用sklearn的内置函数来训练逻辑回归分类器。
clf=sklearn.linear_model.LogisticRegressionCV()
clf.fit(X.T,Y.T)#T是转置的意思
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)+"个")
- 绘制分类:
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)+
"%"+"(正确标记的数据点所占的百分比)")
- 如上结果可见,逻辑回归分类准确定还不到50%,并不是很好。
4 神经网络模型
- 建立神经网络的一般方法:
- 定义神经网络结构(输入单元,隐藏单元数等)
- 初始化模型参数
- 循环:
- 实现前向传播
- 计算损失
- 后向传播以获得梯度
- 更新参数(梯度下降)
4.1 定义神经网络结构
- 定义三个变量:
- n_x:输入层的大小
- n_h:隐藏层的大小(将其设置为4)
- n_y:输出层的大小
- 参数:
- X - 输入数据集,维度为(输入的数量,训练/测试的数量)
- Y - 标签,维度为(输出的数量,训练/测试数量)
- 定义神经网络结构并测试:
def layer_sizes(X,Y):
n_x=X.shape[0]#输入层
n_h=4 #隐藏层,硬编码为4
n_y=Y.shape[0] #输出层
return (n_x,n_h,n_y)
#测试layer_sizes
print("=========================测试layer_sizes=========================")
X_asses , Y_asses = layer_sizes_test_case()
(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))
4.2 初始化模型参数
- 目标:实现initialize_parameters()
- 随机初始化一个维度为(a,b)的矩阵
np.random.randn(a,b)*0.01
- 用零初始化矩阵(a,b)
np.zeros((a,b))
def initialize_parameters(n_x,n_h,n_y)