PyTorch入门学习 10-梯度计算2,不支持张量对张量的求导,它只支持标量对张量的求导

avatar 2024年04月16日10:48:57 0 78 views
博主分享免费Java教学视频,B站账号:Java刘哥

标量(Scalar):

标量是一个单独的数,它没有方向,只有大小。

在深度学习中,标量通常表示一个单独的数值,例如温度、长度或重量等。

 

张量(Tensor):

张量是超过二维的数组,可以表示多维数据。

在深度学习中,张量通常用于表示多维数据或特征张量等。

 

举例说明

x = 1 标量
x = torch.tensor([[1.0, 1.0], [1.0, 1.0]], requires_grad=True)  张量,即
y = x + 2 对张量x每个元素都+2,返回的y依然是张量
y = x.sum() 或 y = x.mean() 对张量x每个元素求总和或平均值,返回的y是标量,即一个数字

求导:

求导 d(out)/dx,首先 x 肯定是张量,如果out也是张量,会报错。需要把 out 处理成标量(数字)

一、张量对张量求导,报错

代码

import torch

x = torch.tensor([[1.0, 1.0], [1.0, 1.0]], requires_grad=True)  # 定义一个张量,需要求导。里面分别为x1, x2, x3, x4
y = x + 2  # y依然是张量
z = y * y * 3  # z依然是张量
z.backward()  # 此处会报错,dz/dx,因为z不是标量,而是一个张量(矩阵)

 

二、标量对张量求导,不会报错

代码

import torch

x = torch.tensor([[1.0, 1.0], [1.0, 1.0]], requires_grad=True)  # 定义一个张量,需要求导。里面分别为x1, x2, x3, x4
y = x + 2  # y依然是张量
z = y * y * 3  # z依然是张量
out = z.mean()  # 求z的均值
out.backward()  # 现在out是一个标量,可以直接调用backward()可以求出out对x的梯度(导数)
print(x.grad)  # 输出梯度,即d(out)/dx

运行结果

tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])

 

三、将张量转成向量

还是以第一个示例为例,在 backward里传入一个全是1的张量,形状和z相同的

代码

import torch
x = torch.tensor([[1.0, 1.0], [1.0, 1.0]], requires_grad=True)  # 定义一个张量,需要求导。里面分别为x1, x2, x3, x4
y = x + 2  # y依然是张量
z = y * y * 3  # z依然是张量  z = 3(y^2) = 3(x+2)^2。
z.backward(torch.ones_like(z))  # 传入一个和z同形状的张量,进行加权求和得到一个标量,然后再调用backward()可以求出z对x的梯度(导数)
print(x.grad)  # 输出梯度,即dz/dx。 dz/dx = 6(x+2)

运行结果

tensor([[18., 18.],
        [18., 18.]])

 

 

 

 

 

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0