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

news2024/11/22 5:30:04

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

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函数获取权重并预测结果,然后使用这些值绘制输出图。您将得到类似的输出。

可视化数据边界

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

各省市90米分辨率DEM数据,多图可下载

之前给大家推了30米分辨率dem数据,有些小伙伴反应也需要90米的,于是今天就给大家推荐一个新数据 —— 各省市90米分辨率DEM数据! 各省市90米分辨率DEM数据广泛应用于国土资源调查、水利水电工程、地质灾害预警、城市规划等领域,对…

JavaFX入门和网格布局面板的使用,Dao层交互,舞台与场景切换以及其他控件的使用

网格布局 将整个面板划分为若干个格子 , 每个格子的大小是一样的 , 每个格子中可以放置一个控件(布局) , 类似于表格的方式。在网格布局 中放入控件的时候 , 还需要指定位置。 GridPane gridPane new GridPane(); 我们将要排出这个布局 , 也就是登陆页…

时间序列预测模型实战案例(十)(CNN-GRU-LSTM)通过堆叠CNN、GRU、LSTM实现多元预测和单元预测

本文介绍 本篇博客为大家讲解的是通过组堆叠CNN、GRU、LSTM个数,建立多元预测和单元预测的时间序列预测模型,其效果要比单用GRU、LSTM效果好的多,其结合了CNN的特征提取功能、GRU和LSTM用于处理数据中的时间依赖关系的功能。通过将它们组合在…

快速构建高质量中文APP登录注册页面Figma源文件

在这个数字化时代,移动应用程序(APP)已经成为我们日常生活中不可或缺的一部分。如果您正在为您的中文APP开发登录注册页面,并寻找高质量的UI设计素材,那么您来对地方了!我们为您提供了一个完整的Figma源文件…

Java语言级别8不支持本地枚举和语言级别 ‘8‘ 不支持 内部类中的 static 声明

Java语言级别8不支持本地枚举和语言级别 8 不支持 内部类中的 static 声明 具体报错情况总结 具体报错情况 今天笔者准备在Test下的测试方法创建枚举类的时候,发现出现了报错Java”语言级别8不支持本地枚举“。 然后又试试创建一个类中包含一个枚举类时,…

JavaFX进阶:学生管理系统结构讲解,复合布局集成,表格数据显示

系统介绍 我们会通过一个学生管理系统来学习 其中 , 分为两个角色 老师 Teacher public class Teacher { private Integer id; private String name; private String password; private String gender; } 学生 Student public class Student { private Integer id; priva…

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割10(测试推理篇)

对于直接将裁剪的patch,一个个的放到训练好的模型中进行预测,这部分代码可以直接参考前面的训练部分就行了。其实说白了,就是验证部分。不使用dataloader的方法,也只需要修改少部分代码即可。 但是,这种方法是不end t…

Busco-真核生物为主基因组质量评估

文章目录 简介Install必须参数谱系数据集输出结果自动谱系选择结果解读完整片段化缺失 自动选择:多domain和污染匹配注意BUSCO报告常用脚本真核Ref 简介 Busco评估基因组质量的核心原理在于通过计算基因组的通用单拷贝标记基因的比例来估计基因组的完整性。其中两个…

Javascript知识点详解:对象的继承、原型对象、原型链

目录 对象的继承 原型对象概述 构造函数的缺点 prototype 属性的作用 原型链 constructor 属性 instanceof 运算符 构造函数的继承 多重继承 对象的继承 面向对象编程很重要的一个方面,就是对象的继承。A 对象通过继承 B 对象,就能直接拥有 B …

C++之函数中实现类、调用总结(二百五十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

MySQL之表的增删改查

目录 表的增删改查1.Create1.1 单行数据 全列插入1.2 多行数据 指定列插入1.3 插入否则更新1.4 替换 2.Retrieve1.1 SELECT 列全列查询指定列查询查询字段为表达式为查询结果指定别名结果去重 1.2 WHERE 条件普遍使用NULL 的查询结果排序筛选分页结果 3.Update对查询到的结果…

vue3+setup 解决:this.$refs引用子组件报错 is not a function

一、如果在父组件中以下四步都没问题的话&#xff0c;再看下面步骤 二、如果父组件引用的是index页面 请在 头部加上以下代码 &#xff08;如果是form页面请忽略这一步&#xff09; <template> <a-modalv-model:visible"visible"title"头部名称&…

MySQL库的库操作指南

1.创建数据库 一般格式&#xff1a;create database (if not exists) database1_name,database2_name...... 特殊形式&#xff1a; create database charset harset_name collate collate_name 解释&#xff1a; 红色字是用户自己设置的名称charset&#xff1a;指定数据…

照片处理软件 DxO FilmPack 7 mac中文版软件介绍

DxO FilmPack 7 mac是一款照片处理软件&#xff0c;专为摄影后期制作而设计。该软件来自法国的DXO公司&#xff0c;它可以在数码影像上模拟胶卷的颜色、对比度、颗粒感等。DxO FilmPack 7提供了多种胶卷颜色效果&#xff0c;包括7种正片胶卷颜色、9种单色照片胶卷颜色、5种负片…

71 内网安全-域横向网络传输应用层隧道技术

目录 必备知识点&#xff1a;1.代理和隧道技术区别?2.隧道技术为了解决什么?3.隧道技术前期的必备条件? 演示案例:网络传输应用层检测连通性-检测网络层ICMP隧道Ptunnel使用-检测利用传输层转发隧道Portmap使用-检测,利用传输层转发隧道Netcat使用-检测,利用,功能应用层DNS隧…

浮点数保留指定位数的小数,小数位自动去掉多余的0

通过DecimalFormat.format可以按照指定的格式格式化数据。 public class test { public static void main(String[] args) { DecimalFormat dnew DecimalFormat(“#.#”);//在有小数的情况下留一位小数&#xff0c;默认是四舍五入 BigDecimal decimalnew BigDecimal(“3.14159…

SQL入门语句

MySQL和SQL的区别是什么&#xff1f;之间是什么关系&#xff1f; SQL&#xff08;Structured Query Language&#xff09;是用于管理和操作关系型数据库&#xff08;RDBMS&#xff09;的标准语言。SQL还可以用于这些RDBMS&#xff1a;MySQL、Oracle、Microsoft SQL Server、Pos…

React进阶之路(二)-- 组件通信、组件进阶

文章目录 组件通信组件通信的意义父传子实现props说明子传父实现兄弟组件通信跨组件通信Context通信案例 React组件进阶children属性props校验组件生命周期 组件通信 组件通信的意义 组件是独立且封闭的单元&#xff0c;默认情况下组件只能使用自己的数据&#xff08;state&a…

0成本LLM微调上手项目,⚡️一步一步使用colab训练法律LLM,基于microsoft/phi-1_5,包含lora微调,全参微调

项目地址 &#xff1a;https://github.com/billvsme/train_law_llm ✏️LLM微调上手项目 一步一步使用Colab训练法律LLM&#xff0c;基于microsoft/phi-1_5 。通过本项目你可以0成本手动了解微调LLM。 nameColabDatasets自我认知lora-SFT微调train_self_cognition.ipynbsel…

P1131 [ZJOI2007] 时态同步

Portal. 先找出树上以 S S S 为起点最长的一条链&#xff0c;然后让其他链的长度都和该链对齐即可。 维护每个结点 x x x 的子树最长链 d max ⁡ ( x ) d_{\max}(x) dmax​(x)&#xff0c;则每次 DFS 求出最长链之后调整对齐的代价为 d max ⁡ ( x ) − ( d max ⁡ ( s o …