昇思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]))  

     

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

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

相关文章

SQLyog脚本无限试用重置脚本

文章目录 引言脚本(win)必要操作、说明 引言 SQLyog 需要po jie,但是网上的没看到很好使的,直接下的官方。能处理14天试用也是很ok的。 脚本(win) echo offREM SQLyog注册表key,可能跟你的不一样,如果不一样,请替换…

ai绘画一条作品变现1400+,怎么做一个赚钱的AI绘画账号?

大家都知道现在AI很火,变现的玩法也多种多样,但一说到AI,大家就下意识认为这东西离我太远,自己没有那么高学历,不会英文,不会用AI模型等。 其实Ai没有大家想象得那么难,尤其在AI绘画这块&#…

DNS访问百度

DNS,英文全称是 domain name system,域名解析系统,它的作用也很明确,就是域名和 IP 相互映射。 假设你要查询 baidu.com 的 IP 地址: 首先会查找浏览器的缓存,看看是否能找到 baidu.com 对应的IP地址,找到就直接返回&…

【第七节】C/C++排序算法

目录 前言 一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、归并排序 六、快速排序 七、 堆排序 八、计数排序 九、桶排序 十、基数排序 前言 排序算法可以大致分为两大类:比较类排序和非比较类排序。以下是这两大类中一些常见的排序算法示例&…

ChatGPT-4o医学应用、论文撰写、数据分析与可视化、机器学习建模、病例自动化处理、病情分析与诊断支持

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5,将人工智能的发展推向了一个新的高度。2023年11月7日,OpenAI首届开发者大会被称为“科技界的春晚”,吸引了全球广大…

WPF布局控件

目录 Grid StackPanel WrapPanel DockPanel UniformGrid Canvas&InkCanvas Canvas InkCanvas Border Grid 属性 ShowGridLines:显示边线 ColumnDefinitions 列集合 表示有几列下面就写几个ColumnDefinition Width 宽:如果写具体数字则表…

科普文:一文搞懂jvm实战(一)Runtime实时监控jvm

概叙 Java Runtime 类是 Java 标准库中的关键类之一。它提供了对当前Java虚拟机(JVM)实例的访问和控制,允许程序动态地修改和管理运行时环境。 Java Runtime 是Java虚拟机(JVM)的一个实例,代表了正在执行Ja…

Spring Boot 实现 AOP 动态热插拔功能并附DEMO源码

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

python中的包和模块

目录 一、包与模块 二、第三方包的安装 2.1 pip install 2.2使用 curl 管道 2.3其他安装方法 三、导入单元的构成 3.1pip的使用 四、模块的缓存 一、包与模块 Python 中除了函数库以外,还有非常多且优秀的第三方库、包、模块。 模块Module:以…

【linux网络(七)】数据链路层详解

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux网络 1. 前言2. 认识MAC…

【计算机毕业设计】061互助学习微信小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

北京网站建设怎么开始做

北京作为中国的首都,拥有众多的企业和机构,网站建设不仅是一种宣传和推广的手段,更是企业发展的必备工具。但是对于很多企业来说,网站建设是一个相对陌生的领域,不知道从哪里开始。今天我们就来谈一谈北京网站建设的步…

Dockerhub无法拉取镜像配置阿里镜像加速器

打开阿里镜像加速地址: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 根据平台类型按照对应方式进行配置:Dokcer Desktop是在右上角点开配置 找到Docker Engine 进行设置JSON结构: 记得要重启Docker服务才会生效&#xff01…

深度学习笔记: 最详尽解释预测系统的分类指标(精确率、召回率和 F1 值)

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家! 预测系统的分类指标(精确率、召回率和 F1 值) 简介 让我们来谈谈预测系统的分类指标以及对精确率、召回…

SpringSecurity6 | 基于数据库实现登录认证

SpringSecurity6 | 基于数据库认证 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 基于数据库实现登…

数据资产的价值变现及管理规划(AMT企源)

从数据资源到数据资产之数据资产的价值变现及管理规划 题记 本文旨在探讨数据资产发展途径、数据产权及价值变现的服务流程和路径,并对数据资产管理平台框架、数据资产管理实施规划做出初步解读,以期为数据资产管理提供有益的思路和方案。 本次推出《从…

09 - Python图形用户界面和游戏开发

图形用户界面和游戏开发 基于tkinter模块的GUI GUI是图形用户界面的缩写,图形化的用户界面对使用过计算机的人来说应该都不陌生,在此也无需进行赘述。Python默认的GUI开发模块是tkinter(在Python 3以前的版本中名为Tkinter)&…

【linux】虚拟机安装 BCLinux-R8-U4-Server-x86_64

目录 一、概述 1.1移动云Linux系统订阅服务 CLS 1.2 大云天元操作系统BC-Linux 二、安装 一、概述 1.1移动云Linux系统订阅服务 CLS 移动云Linux系统订阅服务 CLS (Cloud Linux Service)为使用BC-Linux操作系统的用户提供标准维保服务以及高级技术支…

mysql-5.6.26-winx64免安装版本

mysql为什么要使用免安装 MySQL 提供免安装版本主要有以下几个原因和优势: 便捷性:用户无需经历安装过程,直接解压即可使用。这对于需要快速部署环境或者在不支持安装权限的系统上使用MySQL非常有用。灵活性:免安装版允许用户将…

Optional类方法

Optional类 简介方法empty()方法of(T value)ofNullable(T value)filter(Predicate<? super T> predicate)get()ifPresent(Consumer<? super T> consumer)isPresent()map(Function<? super T,? extends U> mapper)orElse(T other)orElseGet(Supplier<?…