重新设计⼀个求控制流梯度的例⼦,运⾏并分析结果。
时间: 2024-05-07 21:18:31 浏览: 21
假设我们有以下的函数:
```python
def foo(x):
if x > 0:
y = x
else:
y = -x
return y
```
我们可以使用 PyTorch 的自动求导功能来计算函数关于输入 x 的梯度。具体步骤如下:
```python
import torch
# 创建一个 x 的张量,并设置 requires_grad=True,表示要对 x 求梯度
x = torch.tensor(2.0, requires_grad=True)
# 计算函数值
y = foo(x)
# 对 y 求梯度
y.backward()
# 输出 x 的梯度值
print(x.grad)
```
运行结果为:
```
tensor(1.)
```
这个结果表示,当 x 增加一个单位时,函数值 y 也增加了一个单位。因此,函数关于 x 的梯度是 1。
类似地,我们可以修改函数的输入,来观察梯度的变化。例如,我们可以将 x 改为一个向量:
```python
import torch
# 创建一个 x 的张量,并设置 requires_grad=True,表示要对 x 求梯度
x = torch.tensor([2.0, 3.0], requires_grad=True)
# 计算函数值
y = foo(x)
# 对 y 求梯度
y.backward(torch.ones_like(y))
# 输出 x 的梯度值
print(x.grad)
```
这里,我们使用了 `torch.ones_like(y)` 来指定梯度的形状。运行结果为:
```
tensor([1., 1.])
```
这个结果表示,当 x 的第一个分量增加一个单位时,函数值 y 也增加了一个单位;当 x 的第二个分量增加一个单位时,函数值 y 也增加了一个单位。因此,函数关于 x 的梯度是一个向量,每个分量的值都是 1。