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

news2024/11/19 2:23:27

目录

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.coloradmin.cn/o/1887899.html

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

相关文章

借教室(题解)

P1083 [NOIP2012 提高组] 借教室 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a;二分前缀和 我们将和质检员那题差不多&#xff0c;只需要将候选人二分即可 #include<bits/stdc.h> using namespace std; #define int long long int n,m; int r[100000…

精准检测,守护安全:可燃气体报警器检测范围探讨

随着工业化进程的加快&#xff0c;易燃易爆气体的使用日益普遍&#xff0c;其安全隐患也愈发凸显。可燃气体报警器作为一种重要的安全监测设备&#xff0c;能够在气体泄漏时及时发出警报&#xff0c;预防火灾和爆炸事故的发生。 在这篇文章中&#xff0c;佰德将对可燃气体报警…

Docker搭建MySQL双主复制详细教程

在此之前需要提前安装好Docker和 Docker Compose 。 一、创建目录 首先创建一个本地数据挂载目录。 mkdir -p master1-data master2-data二、编写docker-compose.yml version: 3.7services:mysql-master1:image: mysql:5.7.36container_name: mysql-master1environment:MYSQL_…

自动驾驶---Motion Planning之多段五次多项式

1 前言 在之前的博客系列文章中和读者朋友们聊过Apollo的 Motion Planning方案: 《自动驾驶---Motion Planning之LaneChange》 《自动驾驶---Motion Planning之Path Boundary》 《自动驾驶---Motion Planning之Speed Boundary》 《自动驾驶---Motion Planning之轨迹Path优化》…

Python中解决os.listdir命令读取文件乱序问题方法

Python中使用对话框批量打开文件时出现乱序问题的解决方法 一、问题描述二、os.listdir读取文件乱序问题解决方法 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、问题描述 有时候为了方便&#xff0c;我们在进…

Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件

章节内容 上一节完成&#xff1a; HDFS的简介内容HDFS基础原理HDFS读文件流程HDFS写文件流程 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0c;但是没留下…

从零开始学量化~Ptrade使用教程——安装与登录

PTrade交易系统是一款高净值和机构投资者专业投资软件&#xff0c;为用户提供普通交易、篮子交易、日内回转交易、算法交易、量化投研/回测/实盘等各种交易工具&#xff0c;满足用户的各种交易需求和交易场景&#xff0c;帮助用户提高交易效率。 运行环境及安装 操作系统&…

OFDM技术概述8——FBMC

Filter bank multicarrier(FBMC&#xff0c;滤波器组多载波)&#xff0c;是一种类似于OFDM的调制方式&#xff0c;用滤波器抑制子载波的旁瓣大小&#xff0c;使用FFT/IFFT或多相滤波器实现&#xff0c;其应用于5G的主要优势&#xff1a; 子载波信号带限&#xff0c;带外泄漏小…

5.(vue3.x+vite)水平垂直居中实现方式

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 介绍 (1)父级元素设置position:relative; 子级元素设置:position:absolute;left:50%;top:50%;transform: translate(-50%,-50%); 兼容性较好 (1)父级元素设置弹性盒子:display:flex;justify-content:center; a…

LabVIEW幅频特性测试系统

使用LabVIEW软件开发的幅频特性测试系统。该系统整合了Agilent 83732B信号源与Agilent 8563EC频谱仪&#xff0c;通过LabVIEW编程实现自动控制和数据处理&#xff0c;提供了成本效益高、操作简便的解决方案&#xff0c;有效替代了昂贵的专用仪器&#xff0c;提高了测试效率和设…

library source does not match the bytecode for class SpringApplication

library source does not match the bytecode for class SpringApplication 问题描述&#xff1a;springboot源码点进去然后download source后提示标题内容。spring版本5.2.8.RELEASE&#xff0c;springboot版本2.7.18 解决方法&#xff1a;把spring版本改为与boot版本对应的6.…

如何快速去除视频里面的水印字幕等信息?(内附工具)

环境&#xff1a; VSR 需要独显 GPU:N 4070TI 12G 问题描述&#xff1a; 如何快速去除视频里面的水印字幕等信息&#xff1f; 解决方案&#xff1a; 1.打开AI工具VSR&#xff0c;打了要处理的视频 2.右侧滑块调整绿色选框&#xff0c;选中要去的字幕或者水印 这次测试右…

维克日记 v0.4.2:开发者友好的数字化笔记工具

维克日记&#xff0c;专为技术开发者和笔记爱好者设计的数字化笔记工具&#xff0c;以其强大的功能和灵活的配置赢得了用户的好评。软件采用Markdown语法&#xff0c;提供实时预览功能&#xff0c;让您的笔记编辑更加高效和直观。维克日记的用户界面简洁而功能齐全&#xff0c;…

k8s 中间件

1. zookeeper 是的&#xff0c;Zookeeper 和 Kafka 经常一起使用&#xff0c;Zookeeper 在 Kafka 中扮演了关键角色。以下是 Zookeeper 和 Kafka 在实际项目中的结合使用及其作用的详细说明。 项目背景 假设我们有一个分布式数据处理系统&#xff0c;该系统需要高吞吐量的实…

Webpack: 剖析插件基本形态与架构逻辑

概述 Webpack 对外提供了 Loader 与 Plugin 两种扩展方式&#xff0c;其中 Loader 职责比较单一&#xff0c;开发方法比较简单容易理解&#xff1b;Plugin 则功能强大&#xff0c;借助 Webpack 数量庞大的 Hook&#xff0c;我们几乎能改写 Webpack 所有特性&#xff0c;但也伴…

改变图像中特定区域的颜色

背景与原理 再训练施工即系模型中&#xff0c;发现大量施工机械都是黄色的&#xff0c;我需要把它们换成蓝色的&#xff0c;以增强模型使用可靠性。 目前没有尝试深度学习算法&#xff0c;只是简单的进行了处理。 核心目的&#xff1a;通过人工标注与opencv的结合&#xff0…

Cybervadis认证是什么?

Cybervadis认证是一种全面且深入的网络安全评估和认证服务&#xff0c;旨在帮助组织提高其网络安全实践的成熟度&#xff0c;并有效应对不断变化的网络威胁和攻击。以下是关于Cybervadis认证的一些关键信息&#xff1a; 认证目的&#xff1a; 评估和验证组织在网络安全方面的能…

使用目标检测模型YOLO V10 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

这个是在YOLO V10源码的基础上实现的。我只是在源码的基础上做了些许的改动。 YOLO V10源码&#xff1a;YOLO V10源码 YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上&#xff0c;引入了一种新的实时目标检测方法&#xff0c;解决了YOLO 以前版本在后处理和模型架…

计组_虚拟存储器

2024.06.09&#xff1a;计算机组成原理学习笔记 第11节 虚拟存储器* 1.1 分页思想1.1.1 虚拟地址/逻辑地址1.1.2 主存地址/物理地址1.1.3 页表1.1.4 分页方式的缺陷 1.2 分段思想1.2.1 虚拟地址/逻辑地址1.2.2 主存地址/物理地址1.2.3 段表 1.3 段页式思想1.3.1 虚拟地址/逻辑地…

分布式技术专题 | TCP在分布式网络中的通信机制与底层实现

深入解析分布式网络中的TCP通信协议实现 跨地域通信与资源共享网络节点与主机的定义网络技术通信机制TCP/IP协议模型TCP/IP分层机制TCP的Socket链接处理控制TCP的优势和特性自动差错控制正确性和有序性 TCP的Socket使用端口在应用程序间通信TCP的Socket使用端口套接字操作 跨地…