当前位置: 首页 > news >正文

PyTorch 系统教程:PyTorch 入门项目(简单线性回归)

PyTorch是一个开源机器学习库,广泛用于计算机视觉和自然语言处理等深度学习应用。在本指南中,我们将介绍设置PyTorch和启动第一个项目的过程,强调代码示例的清晰度。

在这里插入图片描述

开始使用PyTorch

在开始设置PyTorch之前,请确保系统上安装了Python。建议使用Python 3.7或更高版本。你可以从Python官方网站下载Python。

步骤1:设置虚拟环境

最佳实践是为Python项目创建一个虚拟环境,以便有效地管理依赖关系。使用以下命令创建和激活虚拟环境:

# Install virtualenv if it's not installed
git $ pip install virtualenv

# Create a virtual environment named `pytorch-env`
$ virtualenv pytorch-env

# Activate the virtual environment (Linux and macOS)
$ source pytorch-env/bin/activate

# Activate the virtual environment (Windows)
$ .\pytorch-env\Scripts\activate

一旦虚拟环境被激活,您的终端应该反映这个状态。

步骤2:安装PyTorch

激活虚拟环境后,现在可以安装PyTorch了。安装命令可能因系统配置(cpu或GPU)而异。你可以访问PyTorch网站获取最新的安装命令。下面是安装具有CPU支持的PyTorch的示例命令:

$ pip install torch torchvision

对于那些支持cuda的GPU,命令可能看起来像这样:

$ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

确保特定版本与您的硬件和CUDA版本兼容。

PyTorch项目:简单线性回归

安装PyTorch之后,让我们创建一个基本的项目来演示PyTorch是如何工作的。我们将从一个简单的线性回归模型开始,从x预测y。

步骤3:导入PyTorch

首先创建新的Python文件,比如linear_regression.py,并导入必要的库:

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F

步骤4:定义模型

创建简单线性回归模型,使用Pytorch神经网络模块:

class LinearRegressionModel(nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(1, 1)  # one input and one output

    def forward(self, x):
        return self.linear(x)

super() 函数

  • super() 是一个内置函数,用于调用父类的方法。它返回一个代理对象,该对象可以访问父类的方法。
  • 在这里,super(LinearRegressionModel, self) 表示从 LinearRegressionModel 类的父类(即 nn.Module)中获取一个代理对象。

LinearRegressionModel

  • LinearRegressionModel 是当前类的名称。通过将其作为第一个参数传递给 super(),我们告诉 Python 我们希望从这个类的父类中调用方法。

self

  • self 是当前类实例的引用。它允许我们在类的方法中访问实例的属性和方法。

__init__() 方法

  • __init__() 是一个特殊的方法,用于初始化类的实例。在这里,它是 nn.Module 类的构造函数。
  • 调用 super(LinearRegressionModel, self).__init__() 的目的是确保父类 nn.Module 的初始化逻辑被执行。这通常包括设置一些内部状态和属性,这些状态和属性对于 PyTorch 的模型功能是必需的。

步骤5:初始化模型、损失和优化器

接下来,实例化模型,定义损失函数,并选择优化器:

# Initialize the model, loss function and the optimizer
model = LinearRegressionModel()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

第六步:训练模型

使用简单的训练循环来更新模型的权重:

# Sample data
X_train = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y_train = torch.tensor([[2.0], [4.0], [6.0], [8.0]])

# Training loop
n_epochs = 1000
for epoch in range(n_epochs):
    # Forward pass: Compute predicted y by passing x to the model
    y_pred = model(X_train)

    # Compute the loss
    loss = criterion(y_pred, y_train)

    # Zero gradients, perform a backward pass, and update the weights.
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (epoch+1) % 100 == 0:
        print(f'Epoch {epoch+1}: loss = {loss.item():.4f}')

训练之后,你的模型就可以进行预测了。

步骤7:测试模型

使用你训练过的模型来测试新的数据:

with torch.no_grad():  # Disables gradient calculation
    X_test = torch.tensor([[5.0]])
    y_test_pred = model(X_test)
    print(f'Predicted value for input 5.0: {y_test_pred.item():.4f}')

就是这样!你已经成功地设置了PyTorch,并从头构建了一个简单的线性回归模型。

完整代码

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F

class LinearRegressionModel(nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(1, 1)  # one input and one output

    def forward(self, x):
        return self.linear(x)
    
# Initialize the model, loss function and the optimizer
model = LinearRegressionModel()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# Sample data
X_train = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y_train = torch.tensor([[2.0], [4.0], [6.0], [8.0]])

# Training loop
n_epochs = 1000
for epoch in range(n_epochs):
    # Forward pass: Compute predicted y by passing x to the model
    y_pred = model(X_train)

    # Compute the loss
    loss = criterion(y_pred, y_train)

    # Zero gradients, perform a backward pass, and update the weights.
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (epoch+1) % 100 == 0:
        print(f'Epoch {epoch+1}: loss = {loss.item():.4f}')

with torch.no_grad():  # Disables gradient calculation
    X_test = torch.tensor([[5.0]])
    y_test_pred = model(X_test)
    print(f'Predicted value for input 5.0: {y_test_pred.item():.4f}')

自动结束训练

训练循环的结束条件可以通过多种方式进行动态设置,而不是硬编码为固定的 n_epochs。以下是一些常见的方法,可以根据特定条件自动结束训练循环:

1. 提前停止(Early Stopping)

提前停止是一种常用的技术,当验证集的性能不再改善时,停止训练。这可以防止过拟合。实现方法如下:

# 假设有一个验证集
X_val = torch.tensor([[1.5], [2.5], [3.5], [4.5]])
y_val = torch.tensor([[3.0], [5.0], [7.0], [9.0]])

best_loss = float('inf')
patience = 10  # 允许的无改善的epoch数
counter = 0

for epoch in range(n_epochs):
    # 训练步骤...
    
    # 计算验证损失
    with torch.no_grad():
        y_val_pred = model(X_val)
        val_loss = criterion(y_val_pred, y_val)

    # 检查验证损失是否改善
    if val_loss < best_loss:
        best_loss = val_loss
        counter = 0  # 重置计数器
    else:
        counter += 1

    # 如果验证损失在一定的epoch内没有改善,则停止训练
    if counter >= patience:
        print(f'Early stopping at epoch {epoch+1}')
        break

2. 达到目标损失

可以设置一个目标损失,当损失达到该目标时停止训练:

target_loss = 0.01  # 设定目标损失

for epoch in range(n_epochs):
    # 训练步骤...
    
    # 计算损失
    loss = criterion(y_pred, y_train)

    # 检查是否达到目标损失
    if loss.item() < target_loss:
        print(f'Target loss reached at epoch {epoch+1}')
        break

3. 训练时间限制

可以设置一个最大训练时间,超过该时间后停止训练:

import time

start_time = time.time()
max_time = 60  # 最大训练时间(秒)

for epoch in range(n_epochs):
    # 训练步骤...
    
    # 检查是否超过最大时间
    if time.time() - start_time > max_time:
        print(f'Max training time reached at epoch {epoch+1}')
        break

4. 动态调整学习率

虽然这不是直接的停止条件,但可以根据训练过程中的损失动态调整学习率,并在损失不再改善时停止训练。

通过这些方法,可以使训练过程更加灵活和高效,避免不必要的计算和过拟合。选择合适的停止条件取决于具体的任务和数据集。

最后总结

PyTorch提供了开发复杂机器学习模型所需的灵活性、可扩展性和可访问性。本指南是你PyTorch之旅的第一步。随着你获得更多的经验,可以探索更高级的主题,例如使用gpu进行更快的计算和实现其他类型的神经网络。


文章转载自:

http://xBmL3Ilt.dysgr.cn
http://6Qz8JZoB.dysgr.cn
http://n04XUIGW.dysgr.cn
http://9EJhZieY.dysgr.cn
http://8KwqbhDy.dysgr.cn
http://kwGAUeaE.dysgr.cn
http://cEUokjHc.dysgr.cn
http://ZPcAZoVd.dysgr.cn
http://3HjkAgrB.dysgr.cn
http://x8SWkivx.dysgr.cn
http://IPCI2IA3.dysgr.cn
http://2aHiC0hV.dysgr.cn
http://tU01bqBo.dysgr.cn
http://dp9yEVnR.dysgr.cn
http://n2BUgfxM.dysgr.cn
http://mgq6z9YX.dysgr.cn
http://IGgV8yz8.dysgr.cn
http://jZetKU3o.dysgr.cn
http://Ddd51vXy.dysgr.cn
http://TxKfZq6x.dysgr.cn
http://g4hRhUey.dysgr.cn
http://A7nj2vEX.dysgr.cn
http://GQepPVI9.dysgr.cn
http://yKUMOC6v.dysgr.cn
http://CMW8XYco.dysgr.cn
http://HVKurbkD.dysgr.cn
http://cdrbHj8Z.dysgr.cn
http://aruQUJSk.dysgr.cn
http://RbDymR4i.dysgr.cn
http://PTp3gGdS.dysgr.cn
http://www.dtcms.com/a/28551.html

相关文章:

  • 使用代码与 AnythingLLM 交互的基本方法和示例
  • 30天开发操作系统 第22天 -- 用C语言编写应用程序
  • 模型训练与优化遇到的问题3:安装STM32Cube.AI
  • Webpack的持久化缓存机制具体是如何实现的?
  • 【鸿蒙笔记-基础篇_状态管理】
  • scrapy pipelines过滤重复数据
  • Nginx WebSocket 长连接及数据容量配置
  • 文献阅读 250220-Convective potential and fuel availability complement near-surface
  • 10个Python 语法错误(SyntaxError)常见例子及解决方案
  • 2016年下半年软件设计师上午题的知识点总结(附真题及答案解析)
  • 后端Java Stream数据流的使用=>代替for循环
  • 接口测试-API测试中常用的协议(中)
  • 解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”
  • 本地在ollama上部署deepseek或llama大模型
  • 2024华为OD机试真题-恢复数字序列(C++/Java/Python)-E卷-100分
  • Vue 中组件通信的方式有哪些,如何实现父子组件和非父子组件之间的通信?
  • 【含文档+PPT+源码】基于大数据的交通流量预测系统
  • 解决本地模拟IP的DHCP冲突问题
  • NutUI内网离线部署
  • 20250218反函数求导
  • IPv6报头40字节具体怎么分配的?
  • 快速入门Springboot+vue——MybatisPlus快速上手
  • 16 中介者(Mediator)模式
  • 编写测试计划的六大要素是什么
  • Python网络爬虫技术详解文档
  • 1. 面向对象编程:类/对象/继承/多态
  • 【微信小程序开发】元素顶部重叠
  • Java集合框架之ArrayList解析
  • 简识MQ之Kafka、ActiveMQ、RabbitMQ、RocketMQ传递机制
  • 【量化交易】如何预测股票未来走势(基础版)