如何使用torch实现y=x²的梯度下降,请给出详细代码,并将梯度下降后的图像在代码中显示出来。
时间: 2024-10-10 09:10:57 浏览: 36
第6-1课 梯度下降算法原理与编程实现
在PyTorch中,我们可以使用`autograd`模块来进行自动微分和梯度计算。下面是一个简单的例子,展示如何实现`y = x^2`的梯度下降并可视化结果:
首先,我们需要导入所需的库:
```python
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
```
然后创建一个简单的模型(线性函数作为二次函数的近似),并设置随机种子以便于复现结果:
```python
x_data = torch.linspace(-5, 5, 100) # 定义输入范围
y_data = x_data.pow(2) # y = x^2
# 设置随机种子
torch.manual_seed(0)
model = nn.Sequential(nn.Linear(1, 1)) # 创建一个线性层作为拟合函数
criterion = nn.MSELoss() # 选择均方误差损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 使用SGD优化器,学习率设为0.01
```
接下来,我们定义训练循环,计算梯度并更新模型参数:
```python
epochs = 500 # 迭代次数
for epoch in range(epochs):
# 前向传播
outputs = model(x_data)
loss = criterion(outputs, y_data)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 每100次迭代打印一次损失值
if (epoch + 1) % 100 == 0:
print(f"Epoch {epoch+1}/{epochs}, Loss: {loss.item():.4f}")
# 打印最后的模型参数
print(f"Final parameters: {model[0].weight.item()}")
# 绘制原始数据和拟合线
plt.figure(figsize=(8, 6))
plt.plot(x_data.numpy(), y_data.numpy(), label="Original Data")
plt.plot(x_data.numpy(), model(x_data).detach().numpy(), label="Fitted Line", linestyle='--')
plt.legend()
plt.title("Gradient Descent for y = x^2")
plt.show()
```
在这个例子中,我们通过梯度下降训练了一个线性模型去拟合给定的二次函数数据。经过多次迭代,模型参数逐渐接近真实二次函数的斜率,最终得到的线性拟合能够较好地近似二次曲线。
阅读全文