PyTorch之线性回归模型实现与函数介绍

一、完整代码

今天我们来记录一下如何用pytorch构建线性回归模型以及其中相关的用法。首先还是先奉上完整代码:

import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt


# Hyper-parameters
input_size = 1
output_size = 1
num_epochs = 60
learning_rate = 0.001

# Toy dataset
x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168], 
                    [9.779], [6.182], [7.59], [2.167], [7.042], 
                    [10.791], [5.313], [7.997], [3.1]], dtype=np.float32)

y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573], 
                    [3.366], [2.596], [2.53], [1.221], [2.827], 
                    [3.465], [1.65], [2.904], [1.3]], dtype=np.float32)

# Linear regression model
model = nn.Linear(input_size, output_size)

# Loss and optimizer
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)  

# Train the model
for epoch in range(num_epochs):
    # Convert numpy arrays to torch tensors
    inputs = torch.from_numpy(x_train)
    targets = torch.from_numpy(y_train)

    # Forward pass
    outputs = model(inputs)
    loss = criterion(outputs, targets)
    
    # Backward and optimize
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    if (epoch+1) % 5 == 0:
        print ('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))

# Plot the graph
predicted = model(torch.from_numpy(x_train)).detach().numpy()
plt.plot(x_train, y_train, 'ro', label='Original data')
plt.plot(x_train, predicted, label='Fitted line')
plt.legend()
plt.show()

# Save the model checkpoint
torch.save(model.state_dict(), 'model.ckpt')

二、线性回归模型构建

这段代码是一个简单的线性回归模型,使用PyTorch框架实现。下面是代码的主要组成部分及其功能解释:

  1. 导入必要的库
    • torch:PyTorch库,用于构建和训练神经网络。
    • torch.nn:PyTorch中的神经网络模块。
    • numpy:用于处理数组的库。
    • matplotlib.pyplot:用于绘图的库。
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt


  1. 设置超参数
    • input_size:输入层的大小,这里是1。
    • output_size:输出层的大小,这里是1。
    • num_epochs:训练的轮数。
    • learning_rate:学习率。
# Hyper-parameters
input_size = 1
output_size = 1
num_epochs = 60
learning_rate = 0.001
  1. 创建玩具数据集
    • x_trainy_train是训练数据的特征和目标值。
# Toy dataset
x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168], 
                    [9.779], [6.182], [7.59], [2.167], [7.042], 
                    [10.791], [5.313], [7.997], [3.1]], dtype=np.float32)
y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573], 
                    [3.366], [2.596], [2.53], [1.221], [2.827], 
                    [3.465], [1.65], [2.904], [1.3]], dtype=np.float32)
  1. 定义线性回归模型
    • 使用nn.Linear创建一个线性层,它接受输入大小和输出大小。
# Linear regression model
model = nn.Linear(input_size, output_size)
  1. 定义损失函数和优化器
    • criterion:使用均方误差损失函数MSELoss
    • optimizer:使用随机梯度下降SGD作为优化器。
# Loss and optimizer
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
  1. 训练模型
    • 循环num_epochs次,每次执行以下操作:
      • 将NumPy数组转换为PyTorch张量。
      • 执行前向传播,计算损失。
      • 执行反向传播,并更新模型参数。
# Train the model
for epoch in range(num_epochs):
    # Convert numpy arrays to torch tensors
    inputs = torch.from_numpy(x_train)
    targets = torch.from_numpy(y_train)

    # Forward pass
    outputs = model(inputs)
    loss = criterion(outputs, targets)
    
    # Backward and optimize
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    

  1. 打印训练过程中的损失
    • 每5个epoch打印一次损失值。
    if (epoch+1) % 5 == 0:
        print ('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
  1. 绘制训练数据和拟合线
    • 使用matplotlib绘制原始数据点和拟合的直线。
# Plot the graph
predicted = model(torch.from_numpy(x_train)).detach().numpy()
plt.plot(x_train, y_train, 'ro', label='Original data')
plt.plot(x_train, predicted, label='Fitted line')
plt.legend()
plt.show()
  1. 保存模型检查点
    • 使用torch.save保存模型的状态字典。
# Save the model checkpoint
torch.save(model.state_dict(), 'model.ckpt')

涉及到的常用函数

  1. torch.from_numpy(ndarray)

    • 格式torch.from_numpy(ndarray)
    • 作用:将NumPy数组转换为PyTorch张量。
    • 参数ndarray —— 要转换的NumPy数组。
    • 示例
      inputs = torch.from_numpy(x_train)
      targets = torch.from_numpy(y_train)
      
  2. nn.Linear(in_features, out_features)

    • 格式nn.Linear(in_features, out_features)
    • 作用:创建一个线性层,实现输入到输出的线性变换。
    • 参数
      • in_features —— 输入特征的数量。
      • out_features —— 输出特征的数量。
    • 示例
      model = nn.Linear(input_size, output_size)
      
  3. nn.MSELoss()

    • 格式nn.MSELoss()
    • 作用:创建一个均方误差损失函数,用于衡量预测值和实际值之间的差异。
    • 参数:无默认参数。
    • 示例
      criterion = nn.MSELoss()
      
  4. torch.optim.SGD(params, lr=0, ...)

    • 格式torch.optim.SGD(params, lr=learning_rate, ...)
    • 作用:创建随机梯度下降优化器,用于根据梯度更新模型参数。
    • 参数
      • params —— 模型参数的迭代器。
      • lr —— 学习率,控制更新步长的大小。
    • 示例
      optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
      
  5. model(inputs)

    • 格式model(inputs)
    • 作用:执行模型的前向传播,计算给定输入的输出。
    • 参数inputs —— 输入数据,通常是PyTorch张量。
    • 示例
      outputs = model(inputs)
      
  6. criterion(outputs, targets)

    • 格式criterion(outputs, targets)
    • 作用:计算损失值,即预测输出和目标值之间的差异。
    • 参数
      • outputs —— 模型的预测输出。
      • targets —— 实际的目标值。
    • 示例
      loss = criterion(outputs, targets)
      
  7. optimizer.zero_grad()

    • 格式optimizer.zero_grad()
    • 作用:清除(重置)过往梯度,为反向传播准备。
    • 参数:无。
    • 示例
      optimizer.zero_grad()
      
  8. loss.backward()

    • 格式loss.backward()
    • 作用:计算损失相对于模型参数的梯度。
    • 参数:无。
    • 示例
      loss.backward()
      
  9. optimizer.step()

    • 格式optimizer.step()
    • 作用:根据计算得到的梯度更新模型参数。
    • 参数:无。
    • 示例
      optimizer.step()
      
  10. .detach().numpy()

    • 格式.detach().numpy()
    • 作用:从当前计算图中分离张量,并将其转换为NumPy数组。
    • 参数:无。
    • 示例
      predicted = model(torch.from_numpy(x_train)).detach().numpy()
      
  11. plt.plot(x, y, ...)

    • 格式plt.plot(x, y, ...)
    • 作用:绘制线图。
    • 参数
      • x —— x轴数据。
      • y —— y轴数据。
    • 示例
      plt.plot(x_train, y_train, 'ro', label='Original data')
      plt.plot(x_train, predicted, label='Fitted line')
      
  12. plt.legend()

    • 格式plt.legend()
    • 作用:添加图例到当前图表。
    • 参数:无。
    • 示例
      plt.legend()
      
  13. plt.show()

    • 格式plt.show()
    • 作用:显示当前图表。
    • 参数:无。
    • 示例
      plt.show()
      
  14. torch.save(obj, f)

    • 格式torch.save(obj, f)
    • 作用:将对象保存到文件。
    • 参数
      • obj —— 要保存的对象。
      • f —— 文件路径或文件对象。
    • 示例
      torch.save(model.state_dict(), 'model.ckpt')
      

收工,Ending

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值