标量(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.]])
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏