— (1)机器学习小白入门YOLOv :从概念到实践
(2)机器学习小白入门 YOLOv:从模块优化到工程部署
(3)机器学习小白入门 YOLOv: 解锁图片分类新技能
(4)机器学习小白入门YOLOv :图片标注实操手册
(5)机器学习小白入门 YOLOv:数据需求与图像不足应对策略
(6)机器学习小白入门 YOLOv:图片的数据预处理
(7)机器学习小白入门 YOLOv:模型训练详解

一、训练模型的基本概念和原理简介

原理简介

模型通过一个称为反向传播的过程反复进行预测、计算误差和更新参数。在此过程中,模型会调整其内部参数 (weights and biases) 以减少误差。通过多次重复这一循环,模型逐渐提高了准确性。随着时间的推移,它就能学会识别形状、颜色和纹理等复杂模式。
在这里插入图片描述

模型作用:

YOLOv8 是一个用于 目标检测 的深度学习模型。它的任务是在一张图片中识别出图像中存在的对象,并标记它们的位置(通常用边界框表示)以及每个对象的类别标签。

目标函数(Loss):

在训练过程中,我们需要最小化损失函数。YOLOv8 模型的损失主要包括以下几个部分:

  • 分类损失:判断模型输出的物体类别是否正确。
  • 定位损失:衡量边界框位置与真实目标之间的差距。
  • 置信度损失:判断一个预测框是否包含一个目标对象。

优化器的作用:

使用优化器来更新神经网络中的权重参数,以最小化损失函数。常见优化器有 SGDAdamRMSPropAdamW 等。


二、训练模型的步骤详解

以下是基于 Python 和 YOLOv8 训练目标检测模型的整体流程:

步骤 1:导入必要的库

import torch
from ultralytics import YOLO

注意:

  • ultralytics 是官方提供的对YOLOv8的封装。
  • 使用前需通过 pip 安装 ultralytics 包:
    pip install ultralytics
    

步骤 2:加载预训练模型

model = YOLO("yolov8n.pt")  # 加载YOLOv8小型目标检测预训练权重,也可以使用 'yolov8s.pt'、'yolov8m.pt' 等不同大小的模型
  • yolov8n.pt: 小型网络。
  • yolov8m.pt: 中型网络(默认)。
  • yolov8l.pt/yolov8x.pt: 大型网络,检测精度高但推理速度较慢。

步骤 3:定义训练配置

# 定义模型的训练配置参数
config = {"epochs": 100,         # 总共训练多少轮"imgsz": 640,          # 图像缩放大小"batch_size": 16,      # 每次送入网络的数据量(影响训练速度和内存占用)"workers": 8,          # 数据加载线程数,加速数据读取"device": 'cuda',      # 使用GPU进行训练,'cpu'也可以使用CPU进行训练但会更慢"project": "yolov8_training",     # 训练结果保存的根目录名称(可自定义)"name": "train_exp"        # 当前实验的名字,在 project 文件夹中形成子文件夹
}

步骤 4:开始训练模型

results = model.train(data='coco.yaml',           # 数据集配置文件路径,需要按照格式提供数据集信息epochs=config["epochs"],imgsz=config["imgsz"],batch_size=config["batch_size"],workers=config["workers"],device=config["device"],project=config["project"],name=config["name"]
)

data='coco.yaml' 是 Ultralytics 提供的 COCO 数据集配置文件路径,如果你有自定义的数据集,可以自己按照格式创建一个 .yaml 文件。


步骤 5:验证训练结果

# 在训练完成后对模型进行验证
metrics = model.val()
print(metrics)

val() 方法返回的是在验证数据上的检测指标(如 mAP、Recall 等)。


三、优化器的选择和使用(以 AdamW 为例)

YOLOv8 默认使用的是 AdamW 优化器,它是一个改进的 Adam 优化算法,支持 L2 正则化。

示例:

# 如果你需要手动控制训练过程,也可以直接使用 torch.optim.AdamWfrom torch import optim, nn# 假设你已经有了一个网络模型 model
model = Model()  # 自己定义的神经网络结构optimizer = optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01)
criterion = nn.BCELoss()for epoch in range(config["epochs"]):for batch_data, batch_labels in train_loader:outputs = model(batch_data)loss = criterion(outputs, batch_labels)optimizer.zero_grad()loss.backward()optimizer.step()

四、提前停止策略(Early Stopping)的实现

在模型训练过程中,如果验证集上的损失连续多轮没有下降,则可以考虑提前结束训练。

在这里插入图片描述

from sklearn.model_selection import train_test_split
import torch
from ultralytics import YOLO, EarlyStoppingmodel = YOLO("yolov8n.pt")early_stopper = EarlyStopping(patience=10)  # 设置为10轮没有改进则提前停止for epoch in range(100):model.train()train_loss = model.train()  # 训练val_loss = model.val()      # 验证if early_stopper(val_loss):print("Early stopping triggered.")break

五、如何确定训练纪元数(Epochs)

  • 如果是目标检测任务,建议设置为 100 ~ 500
  • 初始可设为 30,然后观察验证损失是否在下降,再适当增加。
  • 每次增加 20 或 50 轮左右即可。

注意:如果模型过拟合,可以通过早停、数据增强(如 CutMix)等方法缓解。


六、训练过程的监控与记录

输出日志:

YOLOv8 的训练会实时输出以下内容:

  • 每个 epoch 中损失的变化。
  • mAP(mean Average Precision),衡量检测准确率的一个指标。
  • 训练用时和每个 epoch 速度。

可视化工具:

使用 TensorBoard 来查看模型的训练过程,可以通过以下方式启用它:

from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter('runs/train')for i, data in enumerate(train_loader):outputs = model(data)writer.add_scalar("Loss", loss.item(), i)  # 记录损失值

然后使用命令启动 TensorBoard:

tensorboard --logdir runs/train

📌 小结

模块内容
模型选择使用 YOLOv8 的预训练模型 yolov8n.pt
优化器AdamW 是目前最常用的选择,支持权重衰减(防止过拟合)
提前停止若验证损失连续10轮无改进,则终止训练以节省资源
训练纪元数初始设置为50~100,再根据结果增加即可
数据处理需要自定义 data.yaml 文件来描述训练和测试集的路径、类别等信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88884.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88884.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88884.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识MySQL(三)之主从配置与读写分离实战

主重复制 主重复制原理master开启二进制日志记录slave开启IO进程,从master中读取二进制日志并写入slave的中继日志slave开启SQL进程,从中继日志中读取二进制日志并进行重放最终,达到slave与master中数据一致的状态,我们称作为主从…

RabbitMQ面试精讲 Day 2:RabbitMQ工作模型与消息流转

【RabbitMQ面试精讲 Day 2】RabbitMQ工作模型与消息流转 开篇 欢迎来到"RabbitMQ面试精讲"系列的第2天,今天我们将深入探讨RabbitMQ的工作模型与消息流转机制。这是面试中最常被问到的核心知识点之一,90%的RabbitMQ面试都会涉及消息流转流程…

基于SpringBoot3集成Kafka集群

1. build.gradle依赖引入 implementation org.springframework.kafka:spring-kafka:3.2.02. 新增kafka-log.yml文件 在resource/config下面新增kafka-log.yml,配置主题与消费者组 # Kafka消费者群组 kafka:consumer:group:log-data: log-data-grouptopic:log-data: …

wpf Canvas 导出图片

在WPF中将Canvas导出为图片主要涉及以下关键步骤和注意事项: ‌核心实现方法‌使用RenderTargetBitmap将Canvas渲染为位图,再通过PngBitmapEncoder保存为PNG文件。需注意临时移除Canvas的布局变换(LayoutTransform)以避免渲染异常‌1。示例代码片段:CanvasExporter.cs pu…

lvs负载均衡实操模拟

目录 一、配置准备 二、NET模式 修改LVS端 开启路由 修改对内网卡 ens160 修改对外网卡 ens224 加载网卡配置文件 修改web1端 修改网卡信息 重启网络 检测 配置web2 检测 验证配置是否正常 启动nginx服务 验证以上配置 添加lvs规则 验证 三、DR模式 修改…

Spring Boot 是如何简化 IoC 的配置的?

首先Spring Boot 并没有发明新的 IoC 理论,它做的也不是替换掉 Spring IoC 容器。相反,Spring Boot 是 Spring IoC 思想的实践者和简化者。它通过**“约定优于配置”(Convention over Configuration)**的理念,将原本繁…

Go语言中的组合式接口设计模式

文章目录Go语言中的组合式接口设计模式背景和需求组合式接口设计Go语言中的组合式接口设计模式 背景和需求 在微服务架构和复杂业务系统中,我们经常需要调用多个外部服务或内部模块。传统的做法是将所有方法都放在一个大接口中,但这种设计会导致接口臃…

React - createPortal

什么是createPortal&#xff1f;注意这是一个API&#xff0c;不是组件&#xff0c;他的作用是&#xff1a;将一个组件渲染到DOM的任意位置&#xff0c;跟Vue的Teleport组件类似。用法 import { createPortal } from react-dom;const App () > {return createPortal(<div…

Cursor的使用

Cursor的使用 Ctrl L 打开历史对话记录 Tab智能助手 1.单行/多行补全 已有代码片段&#xff1a; //需求&#xff1a;写一个工具类计算数组平均值 public class ArrayUtils {//按tab会完成补全 }按tab键- Cursor 自动生成代码: //需求&#xff1a;写一个工具类计算数组平均值 p…

17.使用DenseNet网络进行Fashion-Mnist分类

17.1 DenseNet网络结构设计import torch from torch import nn from torchsummary import summary #卷积层 def conv_block(input_channels,num_channels):netnn.Sequential(nn.BatchNorm2d(input_channels),nn.ReLU(),nn.Conv2d(input_channels,num_channels,kernel_size3,pad…

网安系列【16】之Weblogic和jboss漏洞

文章目录一 Weblogic1.1 Weblogic相关漏洞1.2 Weblogic漏洞发现1.3 Weblogic漏洞利用二 Jboss2.1 Jboss漏洞2.2 Jboss识别与漏洞利用一 Weblogic WebLogic 是由 Oracle公司 开发的一款基于Java EE&#xff08;现称Jakarta EE&#xff09;的企业级应用服务器&#xff0c;主要用…

Unity URP + XR 自定义 Skybox 在真机变黑问题全解析与解决方案(支持 Pico、Quest 等一体机)

在使用 Unity 的 URP 渲染管线开发 XR 应用&#xff08;如 Pico Neo、Pico 4、Quest 2/3 等一体机&#xff09;时&#xff0c;很多开发者遇到一个奇怪的问题&#xff1a;打包后&#xff0c;Skybox&#xff08;天空盒&#xff09;在某些角度下突然变黑&#xff0c;只在转动头部后…

Cursor、飞算JavaAI、GitHub Copilot、Gemini CLI 等热门 AI 开发工具合集

Cursor&#xff1a;代码编写的智能伙伴​Cursor 是 Anysphere 公司推出的一款 AI 编程工具&#xff0c;它基于微软开源代码编辑器 VS Code 开发&#xff0c;将 AI 技术深度整合到开发人员的工作流程中。Cursor 的功能十分强大&#xff0c;不仅能够自动用纯英文编写代码&#xf…

如何安装历史版本或指定版本的 git

背景 有的时候&#xff0c;我们需要安装指定版本的git&#xff0c;或者希望旧一点的&#xff0c;毕竟我就遇到最新的2.50.1在win10安装后打开就一闪而过&#xff0c;而安装2.49.1就不会 下载 官网可能比较难找&#xff0c;但是这个github仓库&#xff1a;https://github.com/gi…

LaCo: Large Language Model Pruning via Layer Collapse

发表&#xff1a;EMNLP_FINDING_2024 机构&#xff1a;Shanghai Jiao Tong University 连接&#xff1a;LaCo: Large Language Model Pruning via Layer Collapse - ACL Anthology 代码&#xff1a;https://github.com/yangyifei729/LaCo Abstract 基于 Transformer 的大语…

服务器内核级故障排查

目录 **检查内核级故障(Oops/Panic)的具体操作步骤****1. 查看完整 `dmesg` 日志(含时间戳)****2. 过滤关键错误信息****3. 检查系统日志中的内核消息****4. 分析最近一次启动的日志****5. 检查是否有 `vmcore` 转储文件****常见内核错误示例及含义**补充说明:检查内核级故…

Flink学习笔记:整体架构

开一个新坑&#xff0c;系统性的学习下 Flink&#xff0c;计划从整体架构到核心概念再到调优方法&#xff0c;最后是相关源码的阅读。 今天就来学习 Flink 整体架构&#xff0c;我们先看官网的架构图图中包含三部分&#xff0c;分别是 Client、JobManager 和 TaskManager。其中…

【LeetCode 热题 100】105. 从前序与中序遍历序列构造二叉树——(解法二)O(n)

Problem: 105. 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 【LeetCode 热题 100】105. 从前序与中序遍历序列构…

完美卸载 Ubuntu 双系统:从规划到实施的完整指南

&#x1f4d6; 前言 最近成功完成了一次 Ubuntu 双系统的完整卸载&#xff0c;从最初的分区删除到最终解决 GRUB 引导问题&#xff0c;整个过程虽然有些曲折&#xff0c;但最终完美解决。本文将详细分享整个卸载过程&#xff0c;希望能帮助到有类似需求的朋友。 &#x1f3af…

深入理解oracle ADG和RAC

1. 引言 本节详细介绍oracle ADG和RAC。当然这里讲得的详细是相对理论的深入&#xff0c;不涉及到实验&#xff0c;比如ADG和RAC的搭建及调优等。 RAC (Real Application Clusters) 和 ADG (Active Data Guard)是Oracle 的两大核心高可用和灾备技术。它们是 Oracle 数据库高可用…