Pytorch 实现Linear Regression(正确代码 完整注释)

本文通过使用PyTorch库实现了一个简单的线性回归模型,详细介绍了从数据准备到模型构建、训练及评估的全过程。通过实际代码演示了如何定义神经网络结构、设置损失函数和优化器,以及如何进行迭代训练并可视化训练过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pytorch实现简单线性回归

import pandas as pd
import numpy as np
import torch
import torch.nn as nn
#引入变量
from torch.autograd import Variable



#linear regression

'''
生成数据x,y
'''
x = [3, 4, 5, 6, 7, 8, 9]
y = [6, 8, 10, 12, 14, 16, 18]
'''
x_用于绘图,因为下面将x转化为可求导的变量,在转化为numpy不能进行绘图
'''
x_ = np.array(x)  

'''
转化为floattensor,若转为其他形式无法求导
x,y都要进行转化为变量,y不用可求导
'''
x = torch.FloatTensor(x)
x = x.view(-1,1)  #注意此处x,y都要转为(-1,1)张量
x = Variable(x, requires_grad = True)
y = torch.FloatTensor(y)
y = Variable(y)
y = y.view(-1,1)

import matplotlib.pyplot as plt
%matplotlib inline
plt.scatter(x_, y.numpy()) 
#也可以 plt.scatter(x.data.numpy() ,y.numpy())
#绘图时不能用tensor,不能用有求导的tensor来转化
#可以使用x.data.numpy
# .data表示取出内部不求导的tensor

在这里插入图片描述

class LinearRegression(nn.Module):
    def __init__(self, input_size, output_size):
        super(LinearRegression, self).__init__()
        '''
        线性回归
        '''
        self.linear = nn.Linear(input_size, output_size)
    
    def forward(self, x):
    '''
    前向传播
    '''
        return self.linear(x)

input_size = 1
output_size = 1
model = LinearRegression(input_size, output_size)

mse = nn.MSELoss() #loss

'''
优化器
'''
learning_rate = 3e-4
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

'''
loss列表
训练轮数
'''
loss_list = []
iteration_number = 20000

'''
训练
'''
for iteration in range(iteration_number):
    
    '''
    optimizer.zero_grad()对应d_weights = [0] * n

	即将梯度初始化为零(因为一个batch的loss关于weight的导数是所有	sampleloss关于weight的导数的累加和)
	'''
    optimizer.zero_grad()

	'''
	前向传播求出预测的值
	'''
    results = model(x)  #返回为tensor

	'''
	计算loss
	'''
    loss = mse(results, y)

	'''
	反向传播求梯度
	'''
    loss.backward()

	'''
	weights = [weights[k] + alpha * d_weights[k] for k in range(n)]
	更新所有参数
	'''
    optimizer.step()
	'''
	将loss加入loss列表
	'''
    loss_list.append(loss.data)
    
    if(iteration % 1000 == 0 ):
        print('epoch{}, loss {}'.format(iteration, loss.data))



plt.plot(range(iteration_number), loss_list)

'''
m1: [a x b], m2: [c x d]
m1 is [a x b] which is [batch size x in features]

m2 is [c x d] which is [in features x out features]

'''

'''
绘制预测值和真实值
'''
predict = model(x).data.numpy()
plt.scatter(x_, y, color='r')
plt.scatter(x_, predict, color='b')

在这里插入图片描述

<think>好的,用户想要一个完整的、可运行的基于PyTorch框架的Python代码示例。首先,我需要确定用户的需求是什么。他们可能刚接触PyTorch,想通过一个简单的例子来了解如何构建和训练模型。考虑到用户提供的引用内容,提到了.view()方法和动态计算图的特性,所以示例中应该包含这些元素。 接下来,我需要选择一个适合的示例。线性回归是一个基础且容易理解的模型,适合展示张量操作和训练流程。同时,可以加入.view()的使用,比如调整输入数据的形状。动态计算图的话,可以在前向传播中使用条件判断或循环,但为了简单起见,可能先以标准流程为主。 然后,考虑代码结构。需要包括数据准备、模型定义、损失函数、优化器、训练循环和测试部分。数据部分可以用随机生成的数据,模型使用简单的线性层。在训练循环中,确保梯度清零、前向传播、损失计算、反向传播和参数更新步骤清晰。 还要注意代码的可运行性,确保没有缺少的导入库,版本兼容性问题。比如使用PyTorch的常见版本,避免使用过时的函数。此外,添加注释帮助用户理解每一部分的作用。 用户可能希望看到动态计算图的具体应用,比如在模型的前向传播中加入条件语句或循环。但作为基础示例,可能更适合保持简单,之后在相关问题中再深入讨论动态图的应用。 最后,生成相关问题,围绕示例中的内容展开,如.view()的作用、动态计算图的优势、模型保存和加载等。这些问题应该帮助用户进一步探索PyTorch的不同方面。 总结一下,示例代码需要涵盖基本流程,展示关键特性,并确保代码可直接运行。同时,通过相关问题引导用户深入学习。</think>以下是一个完整的、可运行的PyTorch线性回归示例代码,包含数据生成、模型定义、训练和验证全流程: ```python import torch import torch.nn as nn import matplotlib.pyplot as plt # 生成模拟数据(包含动态计算图特性) torch.manual_seed(42) X = torch.linspace(0, 1, 100).view(-1, 1) # 使用.view()改变张量形状[^1] y = 3 * X + 1 + 0.2 * torch.randn(X.size() # 定义线性回归模型 class LinearRegression(nn.Module): def __init__(self): super().__init__() self.linear = nn.Linear(1, 1) # 输入输出维度均为1 def forward(self, x): return self.linear(x) model = LinearRegression() # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.1) # 训练过程(展示动态计算图特性[^2]) losses = [] for epoch in range(100): # 前向传播 predictions = model(X) loss = criterion(predictions, y) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() # 记录损失 losses.append(loss.item()) if (epoch+1) % 10 == 0: print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}') # 可视化结果 plt.scatter(X.numpy(), y.numpy(), label='Original data') plt.plot(X.numpy(), model(X).detach().numpy(), 'r-', label='Fitted line') plt.legend() plt.show() # 打印最终参数 print("训练后参数:") print(f'权重: {model.linear.weight.item():.3f}') print(f'偏置: {model.linear.bias.item():.3f}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值