昇思25天学习打卡营第6天|关于函数与神经网络梯度相关技术探讨

目录

Python 库及 MindSpore 相关模块和类的导入

函数与计算图

微分函数与梯度计算

Stop Gradient

Auxiliary data

神经网络梯度计算


Python 库及 MindSpore 相关模块和类的导入


        Python 中的 numpy 库被成功导入,并简称为 np。numpy 在科学计算领域应用广泛,其为用户提供了高效便捷的数组操作方式以及丰富的数学函数。此外,mindspore 这一特定的深度学习框架或与之相关的库也被引入。从 mindspore 库中,nn 模块被导入,该模块涵盖了与神经网络相关的各类类和函数。同时,ops 模块也从 mindspore 库中被引入,其中包含了多种多样的操作符或者操作函数。不仅如此,Tensor(张量)和 Parameter(参数)这两个类也从 mindspore 库中被导入,它们主要用于构建以及处理模型当中的数据和参数。

        代码如下:

import numpy as np  
import mindspore  
from mindspore import nn  
from mindspore import ops  
from mindspore import Tensor, Parameter

函数与计算图


        计算图乃是借助图论的语言来呈现数学函数的一种形式,同时也是深度学习框架用以表述神经网络模型的统一手段。接下来,我们会依据下面的计算图来构建计算函数以及神经网络。

        代码如下:

x = ops.ones(5, mindspore.float32)  # input tensor  
y = ops.zeros(3, mindspore.float32)  # expected output  
w = Parameter(Tensor(np.random.randn(5, 3), mindspore.float32), name='w') # weight  
b = Parameter(Tensor(np.random.randn(3,), mindspore.float32), name='b') # bias  
def function(x, y, w, b):  
    z = ops.matmul(x, w) + b  
    loss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z))  
    return loss  
loss = function(x, y, w, b)  
print(loss)  

        分析:在 MindSpore 框架中定义了一些张量和参数,并定义了一个计算函数,最后调用该函数并打印结果。

        首先,定义了输入张量 x 为全 1 的 5 维张量,期望输出 y 为全 0 的 3 维张量,权重 w 为 5×3 的随机张量,偏置 b 为 3 维的随机张量。

        然后,定义了一个名为 function 的函数,在函数内部:

        首先通过矩阵乘法 ops.matmul(x, w) 计算 x 和 w 的乘积,再加上偏置 b 得到 z 。

        接着使用 ops.binary_cross_entropy_with_logits 函数计算 z 和 y 之间的二元交叉熵损失,其中还使用了两个全 1 的张量作为其他参数。

        最后,调用 function 函数并传入之前定义的 x、y、w、b ,将计算得到的损失值赋给 loss 并打印出来。

        运行结果:

        3.1194968

微分函数与梯度计算


        为了实现对模型参数的优化,必须求得参数针对损失(loss)的导数。在此情形下,我们调用 mindspore.grad 函数,从而获取关于 function 的微分函数。

        这里所运用的 grad 函数包含两个输入参数,其一为 fn :即有待进行求导操作的函数;其二为 grad_position :用于明确指定求导输入位置的索引。

        代码如下:

grad_fn = mindspore.grad(function, (2, 3))  
grads = grad_fn(x, y, w, b)  
print(grads)  

        分析:定义了一个名为“grad_fn”的梯度计算函数,此函数旨在计算“function”针对输入值“(2, 3)”的梯度情况。运用此前所定义的梯度计算函数“grad_fn”,针对变量“x”、“y”、“w”以及“b”进行梯度的计算操作,并将所得结果存置于“grads”之中。最后通过“print(grads)”语句,将计算得出的梯度“grads”予以打印输出,从而能够方便查看梯度的具体数值情况。

        运行结果:

(Tensor(shape=[5, 3], dtype=Float32, value=  
[[ 3.31783742e-01,  3.25132251e-01,  8.20241794e-02],  
 [ 3.31783742e-01,  3.25132251e-01,  8.20241794e-02],  
 [ 3.31783742e-01,  3.25132251e-01,  8.20241794e-02],  
 [ 3.31783742e-01,  3.25132251e-01,  8.20241794e-02],  
 [ 3.31783742e-01,  3.25132251e-01,  8.20241794e-02]]), Tensor(shape=[3], dtype=Float32, value= [ 3.31783742e-01,  3.25132251e-01,  8.20241794e-02]))  

Stop Gradient


        通常而言,在求导过程中,往往会求取损失(loss)对参数的导数,所以函数的输出一般仅有损失这一项。而当我们期望函数能够输出多项时,微分函数将会对所有的输出项针对参数进行求导。此时,倘若想要达成对某个输出项的梯度截断,或者消除某个张量(Tensor)对梯度的影响,就需要运用停止梯度(Stop Gradient)这一操作。

        代码如下:

def function_with_logits(x, y, w, b):  
    z = ops.matmul(x, w) + b  
    loss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z))  
    return loss, z  
grad_fn = mindspore.grad(function_with_logits, (2, 3))  
grads = grad_fn(x, y, w, b)  
print(grads)  
def function_stop_gradient(x, y, w, b):  
    z = ops.matmul(x, w) + b  
    loss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z))  
    return loss, ops.stop_gradient(z)  
grad_fn = mindspore.grad(function_stop_gradient, (2, 3))  
grads = grad_fn(x, y, w, b)  
print(grads) 

        分析:首先定义了一个名为 function_with_logits 的函数,它接受 x、y、w 和 b 作为参数,通过矩阵乘法和加法计算 z,并基于 z 和 y 计算二分类交叉熵损失 loss 。然后使用 mindspore.grad 计算这个函数关于第 2 和第 3 个参数(可能是 w 和 b )的梯度,并将结果存储在 grad_fn 中。通过调用 grad_fn 并传入相应的参数,获取梯度并打印输出。

        接下来又定义了一个名为 function_stop_gradient 的函数,与前面类似,但对 z 使用了 ops.stop_gradient 操作,这通常用于阻止对 z 的梯度计算。同样计算这个函数关于第 2 和第 3 个参数的梯度,并打印输出。

        总的来说,这段代码是在探索不同函数设置下梯度计算的结果和差异。

        运行结果:

(Tensor(shape=[5, 3], dtype=Float32, value=  
[[ 1.33178377e+00,  1.32513225e+00,  1.08202422e+00],  
 [ 1.33178377e+00,  1.32513225e+00,  1.08202422e+00],  
 [ 1.33178377e+00,  1.32513225e+00,  1.08202422e+00],  
 [ 1.33178377e+00,  1.32513225e+00,  1.08202422e+00],  
 [ 1.33178377e+00,  1.32513225e+00,  1.08202422e+00]]), Tensor(shape=[3], dtype=Float32, value= [ 1.33178377e+00,  1.32513225e+00,  1.08202422e+00]))  
(Tensor(shape=[5, 3], dtype=Float32, value=  
[[ 3.31783742e-01,  3.25132251e-01,  8.20241794e-02],  
 [ 3.31783742e-01,  3.25132251e-01,  8.20241794e-02],  
 [ 3.31783742e-01,  3.25132251e-01,  8.20241794e-02],  
 [ 3.31783742e-01,  3.25132251e-01,  8.20241794e-02],  
 [ 3.31783742e-01,  3.25132251e-01,  8.20241794e-02]]), Tensor(shape=[3], dtype=Float32, value= [ 3.31783742e-01,  3.25132251e-01,  8.20241794e-02]))  

Auxiliary data


        “Auxiliary data”,即辅助数据,指的是函数除首个输出项之外的其他输出内容。通常情况下,我们会把函数的损失(loss)设定为函数的第一个输出,而其余的输出则被定义为辅助数据。

        在 grad 和 value_and_grad 中,提供了 has_aux 参数。当将其设置为 True 时,能够自动达成前面所提及的手动添加 stop_gradient 的功能,从而实现既能返回辅助数据,又不会对梯度的计算效果产生影响。

        代码如下:

grad_fn = mindspore.grad(function_with_logits, (2, 3), has_aux=True)  
grads, (z,) = grad_fn(x, y, w, b)  
print(grads, z)  

        分析:首先定义了一个梯度计算函数 grad_fn ,它是通过 mindspore.grad 方法计算 function_with_logits 函数关于参数 (2, 3) 的梯度,并且设置了 has_aux=True 以处理辅助数据。

        然后,通过 grad_fn 函数对输入的 x 、 y 、 w 、 b 进行梯度计算,得到梯度结果 grads 和辅助数据 z ,最后打印出 grads 和 z 。

        运行结果:

(Tensor(shape=[5, 3], dtype=Float32, value=  
[[ 5.98256774e-02,  8.93863812e-02,  2.36191273e-01],  
 [ 5.98256774e-02,  8.93863812e-02,  2.36191273e-01],  
 [ 5.98256774e-02,  8.93863812e-02,  2.36191273e-01],  
 [ 5.98256774e-02,  8.93863812e-02,  2.36191273e-01],  
 [ 5.98256774e-02,  8.93863812e-02,  2.36191273e-01]]), Tensor(shape=[3], dtype=Float32, value= [ 5.98256774e-02,  8.93863812e-02,  2.36191273e-01])) [-1.5198946  -1.0039824   0.88846767]  

神经网络梯度计算


        在深度学习领域,运用 MindSpore 框架来开展模型训练的操作,是一个常见且重要的工作。其中,涵盖了一系列关键步骤,包括精心设置模型的架构与参数、准确选定适宜的损失函数、清晰定义前向计算的流程以及精准计算梯度的逻辑。而最终将梯度结果成功打印输出,更是整个训练过程中不可或缺的一环。这一系列连贯且有序的操作,共同构成了深度学习模型训练中典型且通用的流程。

        代码如下:

# Define model  
class Network(nn.Cell):  
    def __init__(self):  
        super().__init__()  
        self.w = w  
        self.b = b  
  
    def construct(self, x):  
        z = ops.matmul(x, self.w) + self.b  
        return z  
# Instantiate model  
model = Network()  
# Instantiate loss function  
loss_fn = nn.BCEWithLogitsLoss()  
# Define forward function  
def forward_fn(x, y):  
    z = model(x)  
    loss = loss_fn(z, y)  
    return loss  
grad_fn = mindspore.value_and_grad(forward_fn, None, weights=model.trainable_params())  
loss, grads = grad_fn(x, y)  
print(grads) 

        分析:class Network(nn.Cell): 定义了一个名为 Network 的类,它继承自 nn.Cell,这通常是构建神经网络模型的基础类。

        def __init__(self): 这是类的初始化方法,其中 self.w = w 和 self.b = b 可能是在初始化模型的参数。

        def construct(self, x): 这是模型的前向传播计算方法,通过矩阵乘法和加法计算输出 z。

        model = Network(): 实例化了 Network 类,创建了一个模型对象 model。

        loss_fn = nn.BCEWithLogitsLoss(): 实例化了一个二分类交叉熵损失函数 loss_fn。

        def forward_fn(x, y): 定义了一个前向函数 forward_fn,它首先通过模型计算输出 z,然后使用损失函数计算损失 loss 并返回。

        grad_fn = mindspore.value_and_grad(forward_fn, None, weights=model.trainable_params()): 使用 mindspore 的 value_and_grad 函数获取前向计算的损失值和关于模型可训练参数的梯度。

        loss, grads = grad_fn(x, y): 调用 grad_fn 函数,并将返回的损失值和梯度分别存储在 loss 和 grads 变量中。

        print(grads): 打印出计算得到的梯度值。

        运行结果:

(Tensor(shape=[5, 3], dtype=Float32, value=  
[[ 5.98256774e-02,  8.93863812e-02,  2.36191273e-01],  
 [ 5.98256774e-02,  8.93863812e-02,  2.36191273e-01],  
 [ 5.98256774e-02,  8.93863812e-02,  2.36191273e-01],  
 [ 5.98256774e-02,  8.93863812e-02,  2.36191273e-01],  
 [ 5.98256774e-02,  8.93863812e-02,  2.36191273e-01]]), Tensor(shape=[3], dtype=Float32, value= [ 5.98256774e-02,  8.93863812e-02,  2.36191273e-01]))  

     

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

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

相关文章

2、SSD基本技术

发展史 上文中说SSD是以闪存为介质的存储设备,这只能算是现代SSD的特点,而不能算是定义。 HDD是磁存储,SSD是电存储;HDD的特点导致寻址到不同扇区其性能存在明显差异,比如寻址下个扇区和上个扇区;而SSD寻…

SpringBoot学习06-[SpringBoot与AOP、SpringBoot自定义starter]

SpringBoot自定义starter SpringBoot与AOP SpringBoot与AOP 使用AOP实现用户接口访问日志功能 添加AOP场景启动器 <!--添加AOP场景启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</…

第十四届蓝桥杯省赛C++A组F题【买瓜】题解(AC)

70pts 题目要求我们在给定的瓜中选择一些瓜&#xff0c;可以选择将瓜劈成两半&#xff0c;使得最后的总重量恰好等于 m m m。我们的目标是求出至少需要劈多少个瓜。 首先&#xff0c;我们注意到每个瓜的重量最多为 1 0 9 10^9 109&#xff0c;而求和的重量 m m m 也最多为…

3.2ui功能讲解之graph页面

本节重点介绍 : graph页面target页面flags页面status页面tsdb-status页面 访问地址 $ip:9090 graph页面 autocomplete 可以补全metrics tag信息或者 内置的关键字 &#xff0c;如sum聚合函数table查询 instante查询&#xff0c; 一个点的查询graph查询调整分辨率 resolutio…

中原汉族与北方游牧民族舞蹈文化在这段剧中表现得淋漓尽致,且看!

中原汉族与北方游牧民族舞蹈文化在这段剧中表现得淋漓尽致&#xff0c;且看&#xff01; 《神探狄仁杰》之使团喋血记是一部深入人心的历史侦探剧&#xff0c;不仅以其曲折离奇的案情和狄仁杰的睿智形象吸引观众&#xff0c;更以其对唐代文化的精准再现而备受赞誉。#李秘书讲写…

云计算【第一阶段(23)】Linux系统安全及应用

一、账号安全控制 1.1、账号安全基本措施 1.1.1、系统账号清理 将非登录用户的shell设为/sbin/nologin锁定长期不使用的账号删除无用的账号 1.1.1.1、实验1 用于匹配以/sbin/nologin结尾的字符串&#xff0c;$ 表示行的末尾。 &#xff08;一般是程序用户改为nologin&…

JavaScript——对象的创建

目录 任务描述 相关知识 对象的定义 对象字面量 通过关键字new创建对象 通过工厂方法创建对象 使用构造函数创建对象 使用原型(prototype)创建对象 编程要求 任务描述 本关任务&#xff1a;创建你的第一个 JavaScript 对象。 相关知识 JavaScript 是一种基于对象&a…

Spring Boot配置文件properties/yml/yaml

一、Spring Boot配置文件简介 &#xff08;1&#xff09;名字必须为application,否则无法识别。后缀有三种文件类型&#xff1a; properties/yml/yaml&#xff0c;但是yml和yaml使用方法相同 &#xff08;2&#xff09; Spring Boot 项⽬默认的配置文件为 properties &#xff…

kafka线上问题:rebalance

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是小米。今天,我们来聊聊一个在大数据处理领域常见但又令人头疼的问题——Kafka消费组内的重平衡(rebalance)。这可是阿里巴巴面试中的经…

惠海 H6912 升压恒流芯片IC 支持2.6-40V升12V24V36V48V60V100V 10A 摄影灯 太阳能灯 UV灯 杀菌灯

1.产品描述 H6912是一款外围电路简洁的宽调光比升压调光LED恒流驱动器&#xff0c;可适用于2.6-40V输入 电压范围的LED恒流照明领域。H6912可以实现高精度的恒流效果&#xff0c;输出电流恒流精度≤士3%&#xff0c;电压工作范围为2.6-40V.可以轻松满足锂电池及中低压的应用需…

第十四届蓝桥杯省赛C++B组D题【飞机降落】题解(AC)

解题思路 这道题目要求我们判断给定的飞机是否都能在它们的油料耗尽之前降落。为了寻找是否存在合法的降落序列&#xff0c;我们可以使用深度优先搜索&#xff08;DFS&#xff09;的方法&#xff0c;尝试所有可能的降落顺序。 首先&#xff0c;我们需要理解题目中的条件。每架…

R语言学习笔记1-介绍与安装

R语言学习笔记1-介绍与安装 简介应用领域R语言优势安装步骤&#xff08;linux版本&#xff09;在R脚本中绘制简单的条形图示例 简介 R语言是一种非常强大和流行的据分析和统计建模工具。它是一种开源的编程语言和环境&#xff0c;专门设计用于数据处理、统计分析和可视化。 应…

PHP贵州非遗推广小程序-计算机毕业设计源码14362

摘 要 本文设计并实现了一个基于贵州非遗推广的小程序&#xff0c;旨在通过小程序平台推广和展示贵州省非物质文化遗产。该小程序提供了非遗项目介绍、相关活动展示、购买非遗产品等功能。 首先&#xff0c;我们收集了贵州省各个非遗项目的资料和相关信息&#xff0c;并将其整理…

vue3中使用弹幕组件vue-danmaku

1、最开始使用的是vue3-marquee&#xff0c;后面发现一直有一个bug无法解决&#xff0c;就是鼠标hover到第一个弹幕上字体就会变粗&#xff0c;已经提了issue给作者&#xff0c;但是目前还未答复&#xff0c;所以就换了方案。 地址如下&#xff1a; https://github.com/megasa…

同时安装JDK8和JDK17+环境变量默认无法修改

一、问题描述 当在windows系统中&#xff0c;同时安装JDK8和JDK17&#xff0c;环境变量默认就为jdk17&#xff0c;且从jdk17切换为jdk8后不生效&#xff0c;使用"java -version"命令查看后还是17版本。 解决方法 首先&#xff0c;产生的原因是&#xff0c;在安装…

【高性能服务器】多进程并发模型

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 对于常见的C/S模型…

MySQL 9.0创新版发布!功能又进化了!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

【ARM系列】1of N SPI

1 of N模式 SPI 概述配置流程 概述 GIC-600AE支持1 of N模式SPI。在此模式下可以将SPI target到多个core&#xff0c;并且GIC-600AE可以选择哪些内核接收SPI。 GIC-600AE只向处于powered up 并且使能中断组的core发送SPI。 GIC-600AE会优先考虑那些被认为是active的核&#xf…

如何利用Stable Diffusion在AI绘画领域赚钱,(附详细教程)小白兼职必看!

前言 AIGC 现已成为内容生产的引擎&#xff0c;正为内容创作领域带来前所未有的变革。它不仅能够在文本、图像、视频、音频等单一模态上生成内容&#xff0c;更能实现跨模态的生成&#xff0c;打通了多模态间的壁垒。 对于“普通人”来说&#xff0c;理解并有效的学会利用 AI…

方法重载与重写的区别

1.方法重载和重写都是实现多态的方式&#xff0c;区别在于重载是编译时多态&#xff0c;重写是运行时多态。 2.重载是在同一个类中&#xff0c;两个方法的方法名相同&#xff0c;参数列表不同&#xff08;参数类型、顺序、个数&#xff09;&#xff0c;与方法返回值无关&#x…