深度学习 | 用1层隐藏层的神经网络分类二维数据

本文介绍了使用1个隐藏层的神经网络对二维数据进行分类的实现过程,涵盖从简单的Logistic回归到神经网络模型的构建,包括前向传播、损失计算、后向传播及参数更新。实验目标是实现具有非线性激活函数(如tanh)的神经网络,并计算交叉熵损失。通过实例展示了神经网络相比Logistic回归在分类效果上的改进。
摘要由CSDN通过智能技术生成

本文是吴恩达《深度学习》课程的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)
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值