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

AI学习日记——PyTorch深度学习快速入门:神经网络构建与训练实战

一、神经网络构建

1.nn.Module:网络构建的基石

概念                                           

   nn.Module是所有神经网络模块的基类,我们自定义的网络都需要继承这个类。

DNN代码实现:

class DNN(nn.Module):
    def __init__(self):
        super(DNN, self).__init__()                        #继承初始化
        # 定义网络层

        self.net = nn.Sequential(                              #按顺序搭建各层

            nn.Linear(5,3), nn.ReLU(),                   
            nn.Linear(3,9), nn.ReLU()
        )        
    
    def forward(self, x):
        # 定义前向传播
        self.net (x)
        return x

CNN代码实现:

class CNN(nn.Module):
    def __init__(self, num_classes=10):
        super(CNN, self).__init__()
        # 卷积层序列
        self.net = nn.Sequential(
            # 第一个卷积块
            nn.Conv2d(1, 32, 3, padding=1),  # 输入1通道,输出32通道,3x3卷积
            nn.ReLU(),
            nn.MaxPool2d(2),
            # 第二个卷积块
            nn.Conv2d(32, 64, 3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2),
            # 第三个卷积块
            nn.Conv2d(64, 128, 3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )


    def forward(self, x):

        # 定义前向传播
        x = self.net(x)
        return x

二、损失函数与优化器

1.损失函数

分类任务

import torch.nn as nn

# 交叉熵损失(多分类)
criterion_ce = nn.CrossEntropyLoss()

# 二元交叉熵(二分类)
criterion_bce = nn.BCEWithLogitsLoss()

# 多标签分类
criterion_multilabel = nn.MultiLabelSoftMarginLoss()

回归任务

# 均方误差

criterion_mse = nn.MSELoss()

# 平均绝对误差

criterion_mae = nn.L1Loss()

# 平滑L1损失

criterion_smoothl1 = nn.SmoothL1Loss()

2.优化器选择

常用优化器

import torch.optim as optim

# SGD with Momentum
optimizer_sgd = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

# Adam优化器
optimizer_adam = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999))

# RMSprop
optimizer_rms = optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99)

# Adagrad
optimizer_ada = optim.Adagrad(model.parameters(), lr=0.01)

三、完整训练流程

1.模型训练

def train_model(model, train_loader, val_loader, criterion, optimizer, epochs=10):
    # 记录训练过程
    train_losses = []
    val_accuracies = []
    
    # 设备选择(CPU / GPU)
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model.to(device)
    
    for epoch in range(epochs):
        # 训练阶段
        model.train()
        running_loss = 0.0                                #记录损失变化的列表
        correct = 0
        total = 0
        
        for batch_idx, (data, target) in enumerate(train_loader):
            data, target = data.to(device), target.to(device)
            
            # 前向传播

            output = model(data)
            loss = criterion(output, target)
            
            # 反向传播

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            
            # 统计信息

            running_loss += loss.item()
            _, predicted = output.max(1)
            total += target.size(0)
            correct += predicted.eq(target).sum().item()
            
            # 每100个batch打印一次
            if batch_idx % 100 == 99:
                print(f'Epoch: {epoch+1}, Batch: {batch_idx+1}, '
                      f'Loss: {loss/100:.4f}, '
                      f'Acc: {100.*correct/total:.2f}%')
                running_loss = 0.0
        
        # 验证阶段

        val_acc = evaluate_model(model, val_loader, device)
        val_accuracies.append(val_acc)
        
        print(f'Epoch {epoch+1}/{epochs} completed. Validation Accuracy: {val_acc:.2f}%')
    
    return train_losses, val_accuracies

2.模型评估

def evaluate_model(model, test_loader, device=None):
    if device is None:
        device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    
    model.eval()                                # 设置评估模式(关闭dropout等)

    correct = 0
    total = 0
    
    with torch.no_grad():                  # 暂时禁用梯度计算,节省内存
        for data, target in test_loader:
            data, target = data.to(device), target.to(device)
            output = model(data)
            _, predicted = output.max(1)                        #获得预测类别
            total += target.size(0)
            correct += predicted.eq(target).sum().item()
    
    accuracy = 100. * correct / total
    return accuracy

四、模型保存与加载

1.保存模型

# 保存整个模型
torch.save(model, 'mymodel.pth')

# 只保存模型参数(推荐)
torch.save(model.state_dict(), 'mymodel_weights.pth')

# 保存训练状态(用于恢复训练)
checkpoint = {
    'epoch': epoch,
    'model_state_dict': model.state_dict(),
    'optimizer_state_dict': optimizer.state_dict(),
    'loss': loss,
    'accuracy': accuracy
}
torch.save(checkpoint, 'checkpoint.pth')

2.加载模型

# 加载整个模型
model = torch.load('mymodel.pth')
model.eval()

# 加载模型参数
model = CIFAR10_CNN()
model.load_state_dict(torch.load('mymodel_weights.pth'))
model.eval()

# 恢复训练
checkpoint = torch.load('checkpoint.pth')
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
epoch = checkpoint['epoch']
loss = checkpoint['loss']


总结

        本文介绍了PyTorch神经网络构建与训练的核心流程。首先阐述了如何通过继承nn.Module基类构建DNN和CNN网络,包括网络结构定义和前向传播实现。其次详细说明了不同任务(分类/回归)适用的损失函数,以及SGD、Adam等优化器的选择。然后展示了完整的训练流程,涵盖设备选择、训练循环、验证评估等关键步骤。最后讲解了模型保存与加载的多种方式,包括完整模型保存、参数保存和训练状态恢复。全文提供了可复用的代码模板,涵盖了PyTorch模型开发的核心技术要点。

http://www.dtcms.com/a/513233.html

相关文章:

  • 建材网站织梦房产网站源码
  • 如何创建一个自己的公众号哪里有网站推广优化
  • (六)React事件处理基础内容解析
  • 品牌网站建设需要哪些规划个人做百度云下载网站吗
  • linux_缓冲区及简单libc库【Ubuntu】
  • 北京通州网站建设新手如何做淘宝运营
  • 申请中网可信网站基层建设 官方网站
  • 杭州网站网络 科技公司交互做的好的中国网站
  • Java中String类
  • 呼伦贝尔网站制作网站续费能自己续费吗
  • 怎么去掉wordpress加载动画南京做网站优化
  • Godot4.x的整体架构图解析-源码阅读
  • 广州短视频网站开发服装网站设计
  • 网站自动弹窗代码郑州做网页的公司
  • 做膜结构那个网站好网站切换
  • 怎么用自助网站宁波seo怎么推广
  • 网站排名alexa常用网站有哪些
  • 【DeepSeek新开源】DeepSeek-OCR如何用“视觉压缩”革新长文本处理
  • 反向代理应用:frp
  • SetConsoleCursorPosition函数的用法
  • 一个服务器可以放多少个网站个性化网站建设开发
  • 赣州建站服务山东省工程造价信息网官网
  • 重庆定制网站建设写一个app多少钱
  • 如何做公司宣传网站简单网页制作教程视频
  • @JvmStatic 的作用
  • 单位门户网站功能免费做网站怎么做网站
  • 黄石网站建设定做网站建设公司专业网站科技开发
  • FreeRTOS任务状态获取
  • 南城网站优化公司查询网站流量排名
  • 网站注册可以免费吗开发工具箱