当前位置: 首页 > wzjs >正文

校园网站建设方案公司网站如何制作设计

校园网站建设方案,公司网站如何制作设计,衡阳seo优化报价,如何查询网站是不是诈骗网站文章目录前言自动求导实现非标量变量的反向传播分离计算Python控制流的梯度计算前言 关于走动求导的理论知识个人有点难以理解,推荐大家去看https://blog.csdn.net/weixin_42831564/article/details/135658138这篇文章,讲的很好。 自动求导实现 impor…

文章目录

    • 前言
    • 自动求导实现
    • 非标量变量的反向传播
    • 分离计算
    • Python控制流的梯度计算

前言

关于走动求导的理论知识个人有点难以理解,推荐大家去看https://blog.csdn.net/weixin_42831564/article/details/135658138这篇文章,讲的很好。

自动求导实现

import torchx = torch.arange(4.0)
print(x)

在这里插入图片描述

x.requires_grad_(True)

在这里插入图片描述

print(x.grad)

在这里插入图片描述

#计算y标量
y = 2 * torch.dot(x, x)
print(y)

在这里插入图片描述

y.backward()
print(x.grad)

在这里插入图片描述

print(x.grad == 4 * x)

在这里插入图片描述

x.grad.zero_(),x

在这里插入图片描述

y = x.sum()
y

在这里插入图片描述

y.backward(),y

在这里插入图片描述

print(x.grad)

在这里插入图片描述
为什么 y = x.sum() 的梯度是全 1?

在这里插入图片描述

非标量变量的反向传播

x.grad.zero_()
y = x * x
y.sum().backward()
print(x.grad)
x.grad == 2 * x

在这里插入图片描述
在这里插入图片描述

为什么 y = x * x 后需要 y.sum().backward()

在 PyTorch 中,backward() 只能对标量(scalar,即 0 维张量)进行反向传播,而不能直接对向量/矩阵进行反向传播。因此:

y = x * x 是一个逐元素乘法,得到的 y 仍然是和 x 形状相同的张量(如 [x₁², x₂², x₃², x₄²])。

如果直接调用 y.backward(),PyTorch 会报错,因为 y 不是标量。

解决方法:y.sum().backward()
为了计算 yx 的梯度,我们需要:

y 变成一个标量(通过 sum()mean() 或其他聚合操作)。

y.sum() 计算 x₁² + x₂² + x₃² + x₄²,得到一个标量。

调用 backward(),PyTorch 会自动计算梯度并存储到 x.grad

分离计算

在某层网络需要把参数固定的时候,会用到这个功能

在PyTorch中,y.detach()是一个用于从计算图中分离张量的方法。计算图是PyTorch用于自动微分的关键概念,用于构建和跟踪张量之间的操作。在计算图中,张量的计算历史被记录下来,以便在反向传播时计算梯度。但有时我们希望从计算图中分离出某个张量,使其不再与原始的计算历史关联。这在某些情况下是很有用的,例如当我们只关心使用该张量进行正向传播的结果,并且不需要计算梯度时。

当调用y.detach()时,将返回一个与y相同数据但不再与计算图关联的新张量。这意味着对返回的张量进行操作不会对原始计算图产生任何影响,也不会计算任何梯度。该方法可用于将张量作为输入传递给不允许梯度传播的函数或模型。

在这里插入图片描述

x.grad.zero_()
y = x * x
u = y.detach()  # 把y看成一个常数赋给u u与x无关,是一个常数
print(u)
z = u * x  # z对x的导数 
z.sum().backward()
print(x.grad)
print(u == x.grad)

在这里插入图片描述

# u是常数不是x的函数,y还是x的函数,还是可以对y求x的导数
x.grad.zero_()
y.sum().backward()
print(x.grad)
print(x.grad == 2*x)

在这里插入图片描述

Python控制流的梯度计算

在这里插入图片描述

def f(a):b = a * 2          # (1) b = 2awhile b.norm() < 1000:b = b * 2      # (2) 循环翻倍,直到 ||b|| ≥ 1000if b.sum() > 0:    # (3) 如果 b 的和 > 0,c = b;否则 c = 100*bc = belse:c = 100 * breturn c           # (4) 返回 ca = torch.randn(size=(), requires_grad=True)  # 随机初始化一个标量 a
d = f(a)                                     # 计算 d = f(a)
d.backward()                                 # 反向传播计算梯度
print(a)        # 打印 a 的值
print(d)        # 打印 d 的值
print(a.grad)   # 打印 a 的梯度
print(d / a)    # 计算 d / a
print(a.grad == d / a)  # 判断梯度是否等于 d / a

torch.randn()是一个用于生成服从标准正态分布(均值为0,标准差为1)的随机数的函数

为什么 a.grad == d / a?
关键在于 da 的关系:

da 的线性函数

无论 while 循环执行多少次,b 都是 a 的倍数(b = a * 2 * 2 * ... * 2)。

if-else 分支只是决定 c = bc = 100 * b,所以 c(即 d)仍然是 a 的倍数。

因此,d 可以表示为:d = k⋅a,其中 k 是一个常数(由 while 循环和 if-else 分支决定)。

梯度计算:

d = k * a 求导:在这里插入图片描述
由于 d = k * a,所以 k = d / a

因此:在这里插入图片描述
PyTorch 的 a.grad 存储的就是这个梯度值,所以 a.grad == d / a

http://www.dtcms.com/wzjs/234140.html

相关文章:

  • 陕西自助建站做网站seo网络营销技术
  • 濮阳手机网站建设百度推广代理商
  • 江门建站公司外链发布
  • 宁波教育平台网站建设seo的关键词无需
  • 临淄专业网站优化哪家好谷歌推广seo
  • 自己做网站还是公众号温州seo品牌优化软件
  • 电话怎么做网站域名普通话手抄报文字内容
  • 企业建设网站需要什么资料网站买卖交易平台
  • wordpress加密提示网站关键词排名优化方法
  • 电商网站 编程语言如何制作一个自己的网页网站
  • b站推广网站2024大全人民日报评网络暴力
  • 怎么做网络推广公司免费网站做seo
  • wordpress主题模块添加图片尺寸seo推荐
  • 街道口做网站公司手游推广赚佣金的平台
  • 是否为经营性网站关键词自动生成器
  • wordpress编辑器分页seo测试工具
  • 泉州网站建设推广搜索引擎排名大全
  • 网站建设课程培训搜索引擎排行榜前十名
  • 用了wordpress的网站seo网站推广免费
  • 下载网站后怎么做的焦作seo推广
  • 口碑好的网站推广软件如何制作自己的网站
  • 建设手机行网站网站seo关键词排名
  • 帝国做的网站打开速度公司网站设计的内容有哪些
  • 环保公司网站建设方案成功的网络营销案例有哪些
  • 网站上的定位怎么做seo技术培训
  • 网站优化怎么做分录西安危机公关公司
  • 专业的上海网站建设公司哪家好搜索引擎营销
  • 中粮网站是哪个公司做的免费测试seo
  • 有好点的做网站的公司吗牡丹江seo
  • 网站建设俄语网站推广的案例