我们使用一个自定义的数据,来使用torch实现一个简单的线性回归 假设我们的基础模型就是`y = wx+b`,其中w和b均为参数,我们使用`y = 4x+3.5`来构造数据x、y,所以最后通过模型应该能够得出w和b应该分别接近4和3.5 (注: 训练次数20次, 学习率指定0.1, 最后画图) 1. 准备数据 2. 计算预测值 3. 计算损失,把参数的梯度置为0,进行反向传播 4. 更新参数
时间: 2024-02-09 08:08:59 浏览: 86
好的,下面是使用PyTorch实现简单的线性回归的代码:
```python
import torch
import matplotlib.pyplot as plt
# 准备数据
x = torch.linspace(0, 10, 100)
y = 4 * x + 3.5 + torch.randn(100) # 添加随机噪声
# 定义模型
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear = torch.nn.Linear(1, 1) # 输入和输出都是1维
def forward(self, x):
return self.linear(x)
model = Model()
# 定义损失函数和优化器
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
# 训练模型
num_epochs = 20
for epoch in range(num_epochs):
# 前向传播
y_pred = model(x.unsqueeze(1))
# 计算损失
loss = criterion(y_pred.squeeze(), y)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 打印损失
print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
# 绘制图像
plt.scatter(x, y)
plt.plot(x, model(x.unsqueeze(1)).detach().numpy().squeeze(), color='r')
plt.show()
# 输出模型参数
for name, param in model.named_parameters():
if param.requires_grad:
print(name, param.data)
```
在上面的代码中,我们定义了一个`Model`类来表示我们的线性回归模型。该模型包含一个`Linear`层,输入和输出都是1维。我们还定义了均方误差损失函数和随机梯度下降优化器,并进行了训练。最后,我们绘制了原始数据和拟合的直线,并输出了模型的参数。
注意,由于PyTorch默认使用批量化操作,所以我们在输入数据时需要将一维数据转化为二维数据,即使用`unsqueeze(1)`将x转化为形状为(100, 1)的张量。在绘制拟合的直线时,我们使用`detach()`方法将输出数据从计算图中分离出来,再使用`numpy()`方法将张量转化为NumPy数组。
阅读全文