pytorch实现线性拟合

 一维线性拟合

数据为y=4x+5加上噪音

结果:

import  numpy as np
from    mpl_toolkits.mplot3d import Axes3D
from    matplotlib import pyplot as plt
from torch.autograd import Variable
import torch
from torch import nn

X = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
Y = 4*X + 5 + torch.rand(X.size())

class LinearRegression(nn.Module):
    def __init__(self):
        super(LinearRegression, self).__init__()
        self.linear = nn.Linear(1, 1) # 输入和输出的维度都是1
    def forward(self, X):
        out = self.linear(X)
        return out

model = LinearRegression()
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-2)

num_epochs = 1000
for epoch in range(num_epochs):
    inputs = Variable(X)
    target = Variable(Y)
    # 向前传播
    out = model(inputs)
    loss = 
### 使用 PyTorch 实现线性拟合 #### 数据准备 为了实现线性拟合,通常需要先创建一组带有噪声的数据作为训练集。这些数据可以通过某个已知的非线性函数生成,并加入随机扰动模拟真实场景。 以下是生成样本数据的一个例子: ```python import torch import numpy as np import matplotlib.pyplot as plt # 设置种子以便于结果可重复 torch.manual_seed(0) # 创建输入特征 X 和目标值 y (基于 sin 函数加噪声) X = torch.linspace(-np.pi, np.pi, 100).reshape(-1, 1) # 输入范围 [-π, π] y = torch.sin(X) + 0.1 * torch.randn_like(X) # 添加高斯噪声 plt.scatter(X.numpy(), y.numpy()) plt.title('Sample Data') plt.xlabel('X') plt.ylabel('y') plt.show() ``` 此部分代码展示了如何生成具有正弦波形特性的数据并可视化[^1]。 --- #### 构建神经网络模型 构建一个多层感知机(MLP)模型来进行非线性拟合。这里我们采用两层全连接网络结构,并使用 ReLU 或其他非线性激活函数增强其表达能力。 ```python class NonLinearModel(torch.nn.Module): def __init__(self, input_dim=1, hidden_dim=20, output_dim=1): super(NonLinearModel, self).__init__() self.fc1 = torch.nn.Linear(input_dim, hidden_dim) # 输入层 -> 隐藏层 self.relu = torch.nn.ReLU() # 激活函数 self.fc2 = torch.nn.Linear(hidden_dim, output_dim) # 隐藏层 -> 输出层 def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out model = NonLinearModel() print(model) ``` 上述代码片段定义了一个简单的前馈神经网络,其中 `ReLU` 是一种常见的非线性激活函数,有助于捕捉复杂的模式[^2]。 --- #### 定义损失函数与优化器 对于回归问题,均方误差(MSE Loss)是一种常用的选择。此外,Adam 优化算法因其良好的收敛性能也被广泛推荐。 ```python criterion = torch.nn.MSELoss() # 均方误差损失 optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # Adam 优化器 ``` 此处选择了 MSE 作为评估标准以及 Adam 方法调整权重参数。 --- #### 训练过程 通过多次迭代更新模型参数直至达到满意的精度水平或者完成预定轮次为止。 ```python epochs = 500 losses = [] for epoch in range(epochs): model.train() # 正向传播 predictions = model(X.float()) loss = criterion(predictions, y.float()) # 反向传播和梯度下降 optimizer.zero_grad() # 清除之前的梯度 loss.backward() # 计算当前梯度 optimizer.step() # 更新所有参数 losses.append(loss.item()) if (epoch+1) % 50 == 0: print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}') # 绘制损失变化曲线图 plt.plot(range(len(losses)), losses) plt.title('Training Loss Over Epochs') plt.xlabel('Epoch') plt.ylabel('Loss') plt.show() ``` 这一段脚本实现了完整的训练循环机制,包括计算预测值、衡量差异程度、执行反向传递操作以修正错误等方面的内容。 --- #### 测试效果 最后一步是对最终得到的结果进行检验,看看它能否很好地匹配原始数据分布情况。 ```python with torch.no_grad(): predicted = model(X.float()).detach().numpy() plt.figure(figsize=(8,6)) plt.scatter(X.numpy(), y.numpy(), label='Actual', color="blue", s=10) plt.plot(X.numpy(), predicted, label='Fitted line', color="red", linewidth=2) plt.legend(loc='upper left') plt.title('Nonlinear Fitting Result') plt.show() ``` 以上绘图命令能够直观地比较实际观测点位与由我们的模型推测出来的趋势之间的吻合状况。 --- ### 总结 综上所述,借助 PyTorch 库可以方便快捷地搭建起适合解决各种复杂任务需求的人工神经网络架构,并且只需少量几行简洁明了的 Python 脚本就能完成整个端到端的工作流——从数据预处理到最后的效果呈现全过程都包含在内。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值