pytorch实现单层线性回归模型

文章目录

简述

python使用 数值微分法 求梯度,实现单层线性回归-CSDN博客
python使用 计算图(forward与backward) 求梯度,实现单层线性回归-CSDN博客
数值微分求梯度、计算图求梯度,实现单层线性回归 模型速度差异及损失率比对-CSDN博客

上述文章都是使用python来实现求梯度的,是为了学习原理,实际使用上,pytorch实现了自动求导,原理也是(基于计算图的)链式求导,本文还就 "单层线性回归" 问题用pytorch实现。

代码重构要点

1.nn.Moudle

torch.nn.Module的继承、nn.Sequentialnn.Linear
torch.nn --- PyTorch 2.4 documentation

对于nn.Sequential的理解可以看python使用 计算图(forward与backward) 求梯度,实现单层线性回归-CSDN博客一文代码的模型初始化与计算部分,如图:

nn.Sequential可以说是把图中标注的代码封装起来了,并且可以放多层。

2.torch.optim优化器

本例中使用随机梯度下降torch.optim.SGD()
torch.optim --- PyTorch 2.4 documentation
SGD --- PyTorch 2.4 documentation

3.数据构建与数据加载

data.TensorDatasetdata.DataLoader,之前为了实现数据分批,手动实现了data_iter,现在可以直接调用pytorch的data.DataLoader

对于data.DataLoader的参数num_workers,默认值为0,即在主线程中处理,但设置其它值时存在反而速度变慢的情况,以后再讨论。

数学模型、运行结果

y = X W + b y = XW + b y=XW+b

y为标量,X列数为2. 损失函数使用均方误差。

运行结果:

数据构建与分批

复制代码
def build_data(weights, bias, num_examples):  
    x = torch.randn(num_examples, len(weights))  
    y = x.matmul(weights) + bias  
    # 给y加个噪声  
    y += torch.randn(1)  
    return x, y  
  
  
def load_array(data_arrays, batch_size, num_workers=0, is_train=True):  
    """构造一个PyTorch数据迭代器"""  
    dataset = data.TensorDataset(*data_arrays)  
    return data.DataLoader(dataset, batch_size=batch_size, num_workers=num_workers, shuffle=is_train)

模型封装

复制代码
class TorchLinearNet(torch.nn.Module):  
    def __init__(self):  
        super(TorchLinearNet, self).__init__()  
        model = nn.Sequential(Linear(in_features=2, out_features=1))  
        self.model = model  
        self.criterion = nn.MSELoss()  
  
    def predict(self, x):  
        return self.model(x)  
  
    def loss(self, y_predict, y):  
        return self.criterion(y_predict, y)

运行测试

复制代码
if __name__ == '__main__':  
    start = time.perf_counter()  
  
    true_w1 = torch.rand(2, 1)  
    true_b1 = torch.rand(1)  
    x_train, y_train = build_data(true_w1, true_b1, 5000)  
  
    net = TorchLinearNet()  
    print(net)  
  
    init_loss = net.loss(net.predict(x_train), y_train)  
    loss_history = list()  
    loss_history.append(init_loss.item())  
  
    num_epochs = 3  
    batch_size = 50  
    learning_rate = 0.01  
    dataloader_workers = 6  
  
    data_loader = load_array((x_train, y_train), batch_size=batch_size, is_train=True)  
    optimizer = torch.optim.SGD(net.parameters(), lr=learning_rate)  
  
    for epoch in range(num_epochs):  
        # running_loss = 0.0  
        for x, y in data_loader:  
            y_pred = net.predict(x)  
            loss = net.loss(y_pred, y)  
            optimizer.zero_grad()  
            loss.backward()  
            optimizer.step()  
            # running_loss = running_loss + loss.item()  
            loss_history.append(loss.item())  

    end = time.perf_counter()  
    print(f"运行时间(不含绘图时间):{(end - start) * 1000}毫秒\n")  
  
    plt.title("pytorch实现单层线性回归模型", fontproperties="STSong")  
    plt.xlabel("epoch")  
    plt.ylabel("loss")  
    plt.plot(loss_history, linestyle='dotted')  
    plt.show()  
  
    print(f'初始损失值:{init_loss}')  
    print(f'最后一次损失值:{loss_history[-1]}\n')  
  
    print(f'正确参数: true_w1={true_w1}, true_b1={true_b1}')  
    print(f'预测参数:{net.model.state_dict()}')
相关推荐
一洽客服系统4 分钟前
技术为器,服务为本:AI时代的客服价值重构
人工智能
moonsims2 小时前
无人机桥梁3D建模的拍摄频率
人工智能
LaughingZhu4 小时前
PH热榜 | 2025-05-29
前端·人工智能·经验分享·搜索引擎·产品运营
视觉语言导航4 小时前
俄罗斯无人机自主任务规划!UAV-CodeAgents:基于多智能体ReAct和视觉语言推理的可扩展无人机任务规划
人工智能·深度学习·无人机·具身智能
世润5 小时前
深度学习-梯度消失和梯度爆炸
人工智能·深度学习
小彭律师5 小时前
LSTM+Transformer混合模型架构文档
人工智能·lstm·transformer
-曾牛5 小时前
使用Spring AI集成Perplexity AI实现智能对话(详细配置指南)
java·人工智能·后端·spring·llm·大模型应用·springai
归去_来兮6 小时前
长短期记忆(LSTM)网络模型
人工智能·深度学习·lstm·时序模型
小和尚同志7 小时前
4.9k star-开源版 DeepWiki
人工智能·aigc
悲喜自渡7217 小时前
ST-GCN
pytorch