第三章:人工智能深度学习教程-基础神经网络(第四节-从头开始的具有前向和反向传播的深度神经网络 – Python)

本文旨在从头开始实现深度神经网络。我们将实现一个深度神经网络,其中包含一个具有四个单元的隐藏层和一个输出层。实施将从头开始,并实施以下步骤。
算法:

1. 可视化输入数据
2. 确定权重和偏置矩阵的形状
3. 初始化矩阵、要使用的函数
4. 前向传播方法的实现
5. 实施成本计算
6. 反向传播和优化
7. 预测和可视化输出

模型架构:模型
架构如下图所示,其中隐藏层使用双曲正切作为激活函数,而输出层(即分类问题)使用 sigmoid 函数。

模型架构

权重和偏差:
首先必须声明两个层将使用的权重和偏差,并且其中的权重将随机声明,以避免所有单元的输出相同,而偏差将初始化为零。计算将从头开始并根据下面给出的规则进行,其中 W1、W2 和 b1、b2 分别是第一层和第二层的权重和偏差。这里A代表特定层的激活。


成本函数:
上述模型的成本函数将属于逻辑回归所使用的成本函数。因此,在本教程中我们将使用成本函数:
 

代码:可视化数据

# 导入包
import numpy as np
import matplotlib.pyplot as plt

# 从 planar_utils.py 的 GitHub 仓库中导入所需函数和数据集
from planar_utils import plot_decision_boundary, sigmoid, load_planar_dataset

# 加载示例数据
X, Y = load_planar_dataset()

# 可视化数据
plt.scatter(X[0, :], X[1, :], c=Y, s=40, cmap=plt.cm.Spectral)

这段代码执行以下操作:

  • 导入了NumPy库和Matplotlib库,用于数值计算和数据可视化。
  • planar_utils.py的GitHub仓库中导入了一些自定义函数和示例数据集,包括plot_decision_boundarysigmoidload_planar_dataset
  • 使用load_planar_dataset函数加载了示例数据集,其中X是特征矩阵,Y是目标标签。
  • 使用plt.scatter函数可视化了数据集,将数据点根据目标标签Y的值着色,使用不同的颜色展示不同类别的数据点。

这段代码用于加载示例数据集并可视化数据,以便了解数据的分布和结构。

两个特征的数据集

代码:初始化权重和偏差矩阵
这里隐藏单元的数量为4,因此,W1权重矩阵的形状为(4,特征数),偏差矩阵的形状为(4, 1),广播后根据上面的公式相加得到权重矩阵。同样的情况也适用于W2。

# X --> 输入数据集的形状 (输入大小, 样本数量)
# Y --> 标签的形状 (输出大小, 样本数量)

# 初始化第一层权重和偏置
W1 = np.random.randn(4, X.shape[0]) * 0.01
b1 = np.zeros(shape=(4, 1))

# 初始化第二层权重和偏置
W2 = np.random.randn(Y.shape[0], 4) * 0.01
b2 = np.zeros(shape=(Y.shape[0], 1))

这段代码执行以下操作:

  • 初始化了第一层权重 W1 和偏置 b1,这是一个神经网络的隐藏层。W1 的形状为 (4, 输入大小),b1 的形状为 (4, 1)。这些参数通常需要根据网络结构和问题进行初始化。

  • 初始化了第二层权重 W2 和偏置 b2,这是神经网络的输出层。W2 的形状为 (输出大小, 4),b2 的形状为 (输出大小, 1)。这些参数也需要根据网络结构和问题进行初始化。

这些初始化的参数用于构建神经网络模型,并在训练过程中进行调整以适应数据。通常,它们的初始化值是小的随机值,以帮助网络在训练中学习有效的表示。

代码:前向传播:
现在我们将使用 W1、W2 和偏差 b1、b2 执行前向传播。在此步骤中,在定义为forward_prop的函数中计算相应的输出。

# X --> 输入数据集的形状 (输入大小, 样本数量)
# Y --> 标签的形状 (输出大小, 样本数量)

# 初始化第一层权重和偏置
W1 = np.random.randn(4, X.shape[0]) * 0.01
b1 = np.zeros(shape=(4, 1))

# 初始化第二层权重和偏置
W2 = np.random.randn(Y.shape[0], 4) * 0.01
b2 = np.zeros(shape=(Y.shape[0], 1))

这段代码执行以下操作:

  • 初始化了第一层权重 W1 和偏置 b1,这是一个神经网络的隐藏层。W1 的形状为 (4, 输入大小),b1 的形状为 (4, 1)。这些参数通常需要根据网络结构和问题进行初始化。

  • 初始化了第二层权重 W2 和偏置 b2,这是神经网络的输出层。W2 的形状为 (输出大小, 4),b2 的形状为 (输出大小, 1)。这些参数也需要根据网络结构和问题进行初始化。

这些初始化的参数用于构建神经网络模型,并在训练过程中进行调整以适应数据。通常,它们的初始化值是小的随机值,以帮助网络在训练中学习有效的表示。

代码:定义成本函数:

# 这里 Y 是实际输出
def 计算成本(A2, Y):
    m = Y.shape[1]
    # 实现上述公式
    成本总和 = np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2))
    成本 = -np.sum(成本总和) / m
    
    # 压缩以避免不必要的维度
    成本 = np.squeeze(成本)
    return 成本

这段代码定义了一个函数,用于计算模型的成本。函数的输入参数包括模型的预测输出 A2 和实际目标值 Y。它使用交叉熵损失函数来计算成本。成本是根据模型的预测和实际目标值计算得出的,以衡量模型的性能。最后,通过 np.squeeze 压缩成本以避免不必要的维度。

这个函数用于在训练神经网络时评估模型的性能,并根据成本来调整模型的参数以最小化损失。

代码:最后是反向传播函数:
这是非常关键的一步,因为它涉及大量线性代数来实现深度神经网络的反向传播。求导数的公式可以用线性代数的一些数学概念来推导,我们在这里不打算推导。请记住,dZ、dW、db 是成本函数关于各层的加权和、权重、偏差的导数。

def 反向传播(W1, b1, W2, b2, cache): 

    # 从字典 "cache" 中获取 A1 和 A2
    A1 = cache['A1'] 
    A2 = cache['A2'] 

    # 反向传播:计算 dW1、db1、dW2 和 db2
    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) 
    
    # 根据算法更新参数
    W1 = W1 - 学习率 * dW1 
    b1 = b1 - 学习率 * db1 
    W2 = W2 - 学习率 * dW2 
    b2 = b2 - 学习率 * db2 

    return W1, W2, b1, b2 

这段代码实现了神经网络的反向传播算法,根据损失函数的梯度来更新模型的参数。反向传播用于训练神经网络,通过计算梯度并根据学习率来更新权重和偏置,以最小化成本函数。这个函数返回更新后的参数 W1W2b1b2

代码:训练自定义模型现在我们将使用上面定义的函数来训练模型,可以根据处理单元的便利性和功能来放置历元。

# 请注意,权重和偏置是全局的
# 这里的 num_iterations 对应训练的周期数(epochs)
for i in range(0, num_iterations): 

    # 正向传播。输入: "X, parameters",返回: "A2, cache"。
    A2, cache = forward_propagation(X, W1, W2, b1, b2) 
    
    # 成本函数。输入: "A2, Y"。输出: "cost"。
    cost = compute_cost(A2, Y) 

    # 反向传播。输入: "parameters, cache, X, Y"。输出: "grads"。
    W1, W2, b1, b2 = backward_propagation(W1, b1, W2, b2, cache) 
    
    # 每隔 1000 次迭代打印成本
    if print_cost and i % 1000 == 0: 
        print ("第 %i 次迭代后的成本: %f" % (i, cost))

这段代码执行以下操作:

  • 通过循环(for i in range(0, num_iterations)),进行多个训练周期(epochs)的迭代。在每个训练周期中,模型将数据进行正向传播(forward_propagation)、计算成本(compute_cost)并进行反向传播(backward_propagation)来更新参数。

  • 正向传播计算模型的预测输出 A2 和缓存信息 cache

  • 成本函数计算模型的成本,用于评估模型的性能。

  • 反向传播计算参数的梯度,然后使用梯度下降算法来更新权重和偏置。

  • 如果 print_cost 为真并且迭代次数能被 1000 整除,将打印出当前迭代次数和成本值,以监控训练进度。

这个代码段用于训练神经网络,以便模型可以逐渐优化,以拟合训练数据并获得更好的性能。

使用学习参数进行
输出训练模型后,使用上面的forward_propagate函数获取权重并预测结果,然后使用这些值绘制输出图。您将得到类似的输出。

可视化数据边界

结论:
深度学习是一个掌握基础知识的人占据王座的世界,因此,尝试将基础知识发展得足够强大,以便之后,您可能成为新模型架构的开发人员,这可能会彻底改变社区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/123123.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【黑马程序员】SpringCloud——微服务

文章目录 前言一、服务架构演变1. 单体架构2. 分布式架构2.1 服务治理 3. 微服务3.1 微服务结构3.2 微服务技术对比3.3 企业需求 二、SpringCloud兼容性 三、服务拆分及远程调用1. 服务拆分1.1 服务拆分注意事项1.2 导入服务拆分 Demo 2. 远程调用2.1 根据订单 id 查询订单功能…

conda不同环境pip list包都一样问题;conda国内镜像加速

1、conda不同环境pip list包都一样问题 注意是因为conda创建不同环境里用pip安装容易导致,因为pip install安装 python包管理大多都默认到一个地方,正常用conda install就会有隔离 参考:https://blog.csdn.net/tywwwww/article/details/127…

什么是运营商精准大数据?又有什么作用?

大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 精准大数据,是一种…

Python之Django

web应用程序 # Django框架是一款专门用来开发web应用的框架 # Web应用程序是一种可以通过浏览器访问的应用程序, B/S架构 案例:淘宝网、京东... # 应用程序有两种模式: C/S:客户端/服务器端程序,这类程序一般独立运行 B/S:…

linux之进程控制

进程创建&fork函数 fork函数之前就已经提到,它从已存在进程中创建一个新进程,新进程为子进程,而原进程为父进程。 调用接口:fork() 头文件:unistd.h 功能:创建一个子进程,给子进程返回0,父进程返回子进程pid …

如何用devtools快速开发一个R语言包?

如何用devtools快速开发一个R语言包? 1. 准备工作2. 如何完整开发一个R包3. 初始化新包4. 启用Git仓库5. 按照目标实现一个函数6. 在.R文件夹下创建文件并保存代码7. 函数测试8. 阶段性总结9. 时不时地检查完整工作状态10. 编辑DESCRIPTION文件11. 配置许可证12. 配…

vuecli3 批量打印二维码

安装以个命令: npm install qrcode --save npm install print-js --save 页面使用: import qrcode from qrcode import printJS from print-js <el-button type"primary" click"handleBulkPrint">批量打印</el-button>methods: {// 批量打印…

小H靶场学习笔记:DC-1

DC-1 Created: November 8, 2023 11:41 PM Tags: Drupal, SUID提权 Owner: 只惠摸鱼 打靶场过程 nmap扫描 存活主机 192.168.199.128可能性更大 8011122端口开发 &#xff0c;访问跳转出Drupal页面&#xff0c;确定为靶机 使用插件进行指纹识别 可知以下信息&#xff1a…

Android Studio导入,删除第三方库

Android项目经常用到无私的程序员们提供的第三方类库。本篇博客就是实现第三方库的导入和删除。 一、导入第三方库 1、将需要的库下载到本地&#xff1b; 2、新建Moudle (1)File --- New Moudle (2)选择Android Library --- Next (3)填写Moudle名 --- Finish。一个新的Mou…

变电站自动化系统中的安全措施分析及应用-安科瑞

安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;阐述变电运行中的问题&#xff0c;电气自动化系统与安全运行措施&#xff0c;包括自动控制设备的投入&#xff0c;电气自动 化与计算机技术相、设备数据的采集与处理、自动化系统的升级、人工智能技术的应用。 关键…

【Git】Git 学习笔记_操作本地仓库

1. 安装与初始化配置 1.1 安装 下载地址 在文件夹里右键点击 git bash here 即可打开命令行面板。 git -v // 查看版本1.2 配置 git config --global user.name "heo" git config --global user.email xxxgmail.com git config --global credential.helper stor…

深度学习入门-基于Python的理论与实现摘要记录

基本是《深度学习入门-基于Python的理论与实现》的复制粘贴&#xff0c;以作为日后的检索和查询使用 感知机 感知机接收多个输入信号&#xff0c;输出一个信号。 感知机原理 感知机接收多个输入信号&#xff0c;输出一个信号。 图2-1是一个接收两个输入信号的感知机的例子。…

uniapp:打包ios配置隐私协议框

使用uniapp打包ios 上架商店需要配置隐私协议政策弹窗。当用户点击确定后才能继续操作。 首先manifest.json中配置使用原生隐私政策提示框是不支持ios的。不用勾选。 解决思路&#xff1a; 1、新建页面&#xff1a;iosLogin.vue&#xff0c;pages.json中 这个页面需要放在第一…

计算机网络:概述

0 学时安排及讨论题目 0.1讨论题目&#xff1a; CSMA/CD协议交换机基本原理ARP协议及其安全子网划分IP分片路由选择算法网络地址转换NATTCP连接建立和释放再论网络体系结构 0.2 本节主要内容 计算机网络在信息时代中的作用 互联网概述 互联网的组成 计算机网络在我国的发展 …

extractvalue报错注入理论及实战

报错注入 什么是报错注入 构造语句&#xff0c;让错误信息中夹杂可以显示数据库内容的查询语句&#xff0c;返回报错提示中包括数据库中的内容 如上图所示&#xff0c;通过group by的报错&#xff0c;我们可以知道列数是多少 输入正确的查询数据库的SQL语句&#xff0c;虽然可…

Zookeeper经典应用场景实战(二)

1. Zookeeper 分布式锁实战 1.1 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候&#xff0c;大家往往采用Synchronized&#xff08;同步&#xff09;或者其他同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中&#xff0c;就需要 一种更…

android studio 字节码查看工具jclasslib bytecode viewer

jclasslib bytecode viewer 是一款非常好用的.class文件查看工具&#xff1b; jclasslib bytecode editor is a tool that visualizes all aspects of compiled Java class files and the contained bytecode. Many aspects of class files can be edited in the UI. In addit…

excel表的筛选后自动求和

一般都使用subtotal函数。 通过看一个大佬的视频&#xff0c;发现可以有更简单的方法。 首先任意筛选数据(ctrlshiftl)&#xff0c; 然后选中需要求和的列的最下方的空白单元格&#xff0c;再按alt。 回车即可。 实质它还是用的subtotal函数

【TiDB】TiDB CLuster部署

目录 0 大纲 一 集群部署工具TiUP简介 1 TiUP 简介 2 TiUP使用 3 TiUP使用举例 二 TiDB Cluster安装配置需求 1 生产环境硬件需求 2 操作系统需求 三 TIDB部署 1 软硬件需求以及前置检查​编辑 2 安装TiUP 组件 ​3 集群拓扑文件 4 执行部署命令 &#xff08;1&…

Spring Gateway网关服务分析

关键原理解析 基本原理 Spring Cloud Route核心可以概括为Gateway过滤器框架和Route定义和解析两块内容。 DefaultFilter、GatewayFilter、GlobalFilter 三种过滤器的区别及执行顺序 SpringCloud Gateway中的提到的过滤器包括三种类型&#xff1a; DefaultFilter&#xff1…