首页 > 其他分享 >简单的模型训练学习

简单的模型训练学习

时间:2024-06-07 14:58:49浏览次数:13  
标签:loss 训练 模型 loader 学习 train test self

一、操作流程

  1. 加载数据集
  2. 数据预处理:
    • 将输入输出按特定格式拼接
    • 文本转 Token IDs
    • 通过 labels 标识出哪部分是输出(只有输出的 token 参与 loss 计算)
  3. 加载模型、Tokenizer
  4. 定义数据规整器
  5. 定义训练超参:学习率、批次大小、...
  6. 定义训练器
  7. 开始训练
  8. 注意:训练后推理时,输入数据的拼接方式要与训练时一致

二、训练样例

三、训练过程

1、 导入必要的库

from __future__ import print_function  # 使print函数兼容Python 2.x
import torch  # PyTorch的核心库
import torch.nn as nn  # PyTorch的神经网络模块
import torch.nn.functional as F  # PyTorch的函数模块,包含常用函数
import torch.optim as optim  # PyTorch的优化器模块
from torchvision import datasets, transforms  # 数据集和数据预处理工具
from torch.optim.lr_scheduler import StepLR  # 学习率调度器

2、设置一些超参数

BATCH_SIZE = 64  # 每次训练的批量大小
TEST_BACTH_SIZE = 1000  # 每次测试的批量大小
EPOCHS = 5  # 训练的轮数(遍历整个训练集的次数)
LR = 0.01  # 学习率
SEED = 42  # 随机种子,确保结果可重复
LOG_INTERVAL = 100  # 每隔多少个批次打印一次日志

3、定义神经网络模型

class FeedForwardNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 第一层784维输入、256维输出 -- 图像大小28×28=784
        self.fc1 = nn.Linear(784, 256)
        # 第二层256维输入、128维输出
        self.fc2 = nn.Linear(256, 128)
        # 第三层128维输入、64维输出
        self.fc3 = nn.Linear(128, 64)
        # 第四层64维输入、10维输出 -- 输出类别10类(0,1,...9)
        self.fc4 = nn.Linear(64, 10)

        # Dropout module with 0.2 drop probability
        self.dropout = nn.Dropout(p=0.2)

    def forward(self, x):
        # 把输入展平成1D向量
        x = x.view(x.shape[0], -1)

        # 每层激活函数是ReLU,额外加dropout
        x = self.dropout(F.relu(self.fc1(x)))
        x = self.dropout(F.relu(self.fc2(x)))
        x = self.dropout(F.relu(self.fc3(x)))

        # 输出为10维概率分布
        x = F.log_softmax(self.fc4(x), dim=1)

        return x

4、 定义训练过程

# 训练过程
def train(model, loss_fn, device, train_loader, optimizer, epoch):
    # 开启梯度计算
    model.train()
    for batch_idx, (data_input, true_label) in enumerate(train_loader):
        # 从数据加载器读取一个batch
        # 把数据上载到GPU(如有)
        data_input, true_label = data_input.to(device), true_label.to(device)
        # 求解器初始化(每个batch初始化一次)
        optimizer.zero_grad()
        # 正向传播:模型由输入预测输出
        output = model(data_input)
        # 计算loss
        loss = loss_fn(output, true_label)
        # 反向传播:计算当前batch的loss的梯度
        loss.backward()
        # 由求解器根据梯度更新模型参数
        optimizer.step()

        # 间隔性的输出当前batch的训练loss
        if batch_idx % LOG_INTERVAL == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data_input), len(train_loader.dataset),
                100. * batch_idx / len(train_loader), loss.item()


 

5、 定义测试过程

# 计算在测试集的准确率和loss
def test(model, loss_fn, device, test_loader):
    model.eval() # 设置模型为评估模式
    test_loss = 0 # 初始化测试损失
    correct = 0  # 初始化正确预测数
    with torch.no_grad():   # 关闭梯度计算
        for data, target in test_loader:  # 遍历测试数据集
            data, target = data.to(device), target.to(device) # 将数据和标签移到设备
            output = model(data) # 前向传播:计算输出
            # sum up batch loss 
            test_loss += loss_fn(output, target, reduction='sum').item() # 累加批次损失
            # get the index of the max log-probability
            pred = output.argmax(dim=1, keepdim=True) # 获取最大概率的预测值
            correct += pred.eq(target.view_as(pred)).sum().item()   # 统计正确预测的数量

    test_loss /= len(test_loader.dataset)  # 计算平均测试损失

    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))   # 打印测试结果:平均损失和准确率

6、 主函数

def main():
    use_cuda = torch.cuda.is_available()  # 检查是否有GPU可用
    torch.manual_seed(SEED)  # 设置随机种子,确保结果可重复
    device = torch.device("cuda" if use_cuda else "cpu")  # 设置计算设备:GPU或CPU

    train_kwargs = {'batch_size': BATCH_SIZE}  # 训练数据加载参数
    test_kwargs = {'batch_size': TEST_BACTH_SIZE}  # 测试数据加载参数

    if use_cuda:
        cuda_kwargs = {'num_workers': 1, 'pin_memory': True, 'shuffle': True}  # 额外的CUDA参数
        train_kwargs.update(cuda_kwargs)  # 更新训练数据加载参数
        test_kwargs.update(cuda_kwargs)  # 更新测试数据加载参数

    transform = transforms.Compose([  # 定义数据预处理步骤
        transforms.ToTensor(),  # 转为张量
        transforms.Normalize((0.1307,), (0.3081,))  # 归一化
    ])

    dataset_train = datasets.MNIST('data', train=True, download=True, transform=transform)  # 下载并加载训练数据集
    dataset_test = datasets.MNIST('data', train=False, transform=transform)  # 下载并加载测试数据集

    train_loader = torch.utils.data.DataLoader(dataset_train, **train_kwargs)  # 定义训练数据加载器
    test_loader = torch.utils.data.DataLoader(dataset_test, **test_kwargs)  # 定义测试数据加载器

    model = FeedForwardNet().to(device)  # 创建神经网络模型,并移到设备
    optimizer = optim.SGD(model.parameters(), lr=LR)  # 定义优化器(随机梯度下降)
    loss_fn = F.nll_loss  # 定义损失函数(负对数似然损失)

    for epoch in range(1, EPOCHS + 1):  # 训练多个轮次
        train(model, loss_fn, device, train_loader, optimizer, epoch)  # 训练模型
        test(model, loss_fn, device, test_loader)  # 测试模型

7、 运行主函数
 

if __name__ == '__main__':
    main()  # 仅在脚本直接运行时执行主函数

四、 总结
整个代码通过以下几个步骤实现了一个完整的神经网络训练和测试流程:
1. **导入库**:引入必要的工具和库。
2. **设置参数**:定义训练和测试的相关超参数。
3. **定义模型**:构建一个简单的全连接神经网络模型。
4. **定义训练过程**:编写训练模型的逻辑。
5. **定义测试过程**:编写测试模型的逻辑。
6. **主函数**:设置设备、加载数据、创建模型、定义优化器和损失函数,然后进行训练和测试。
7. **运行主函数**:确保代码在直接运行时执行主函数。

通过这些步骤,我们实现了一个能够对MNIST手写数字进行分类的神经网络模型,并完成了训练和测试过程。

标签:loss,训练,模型,loader,学习,train,test,self
From: https://blog.csdn.net/pumpkin84514/article/details/139307647

相关文章

  • Diffusers代码学习: IP-Adapter(续)
    但是IP-Adapter不仅可以通过文生图的方式,也可以通过图生图的方式生成目标图片,就无需使用提示词。只不过同上一篇所述,底层的逻辑和图生图是完全不同的。# 以下代码为程序运行进行设置,使用图生图的自动管道,importosos.environ["HF_ENDPOINT"]="https://hf-mirror.com" ......
  • 基于函数计算部署GPT-Sovits语音生成模型实现AI克隆声音
    GPT-Sovits是一个热门的文本生成语音的大模型,只需要少量样本的声音数据源,就可以实现高度相似的仿真效果。通过函数计算部署GPT-Sovits模型,您无需关心GPU服务器维护和环境配置,即可快速部署和体验模型,同时,可以充分利用函数计算按量付费,弹性伸缩等优势,高效地为用户提供基于GPT-Sovits......
  • 视频大模型 Vidu 支持音视频合成;字节跳动推出语音生成模型 Seed-TTS 丨 RTE 开发者日
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,......
  • k8s学习--ingress详细解释与应用(nginx ingress controller))
    文章目录lngress简介什么是IngressIngress的用途Ingress的工作原理Ingress的工作流程Ingress的应用场景应用实验环境部署nginxingresscontroller1.安装metalLB2.nginxingresscontroller部署3.ingress对象应用案例(基于名称的负载均衡)(1)创建deployment控制......
  • AI 绘画零基础如何学习?AIGC绘画设计入门教学
    AI作画入门到是不难,有手就行。我们先从最简单的开始。完成这件事,只有一个步骤:找到一个能画画的AI工具,输入动机。这个工具叫做DiscoDiffusion。它只认识英文,不过这不是问题,你找个翻译软件把中文翻译成英文就行。如果你会科学上网,那么你打开这个网址,点击里面的"openincola......
  • Linux磁盘管理-LVM入门学习建议
    Linux磁盘管理-LVM入门学习建议准确掌握基础概念基础概念非常重要,以LVM逻辑卷为例,必须熟练掌握LV、PV以及VG的基本概念。之后才能进行更为复杂的管理操作。LVM基本大纲这里罗列出了学习LVM入门的基本大纲,供大家参考......
  • 本地配置离线的llama3大模型实现chatgpt对话详细教程
    参考:Llama3本地部署及API接口本地调试,15分钟搞定最新MetaAI开源大模型本地Windows电脑部署_llama3本地部署-CSDN博客 正在下载-----importrequestsimportjsonurl="http://localhost:11434/api/generate"data={&......
  • LangChain实战技巧之五:让模型“自动生成”Prompt(提示词)的两种方式
    预备知识with_structured_outputbind_tools对这两种方式不了解的朋友,可以翻阅我的这篇文章找到用法哈LangChain实战技巧之三:关于Tool的一点拓展实现方法方法一步骤一#首先,新建一个提示词抽取器prompt_extractor=ChatPromptTemplate.from_template(template="""......
  • 生产消费模型
    一、生产消费者模型1.1、例子引入        我们在日常生活中,一般都是通过超市,集市等场所,来购买日常用品,而不会直接向生产商进行购买。超市则会统一向各个生产商批发商品,然后售卖给人们。        如果我们直接去供货商那里买东西,那我们只会要很少的商品,供货商......
  • BERT+P-Tuning文本分类模型
    基于BERT+P-Tuning方式文本分类模型搭建模型搭建本项目中完成BERT+P-Tuning模型搭建、训练及应用的步骤如下(注意:因为本项目中使用的是BERT预训练模型,所以直接加载即可,无需重复搭建模型架构):一、实现模型工具类函数二、实现模型训练函数,验证函数三、实现模型预测函......