Datawhale 零基础入门CV-Task04.模型训练与验证

2024-01-24 09:08

本文主要是介绍Datawhale 零基础入门CV-Task04.模型训练与验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

一个成熟合格的深度学习训练流程至少具备以下功能

  • 在训练集上进行训练,并在验证集上进行验证
  • 模型可以保存最优的权重,并读取权重
  • 记录下训练集和验证集的精度,便于调参

学习目标

  • 理解验证集的作用,并使用训练集和验证集完成训练
  • 学会使用Pytorch环境下的模型读取和加载,并了解调参流程

构造验证集

  • 在机器学习模型的训练过程中,模型是非常容易过拟合的深度学习模型在不断的训练过程中训练误差会逐渐降低,但测试误差的走势则不一定。
  • 在模型的训练过程中,模型只能利用训练数据来进行训练,模型并不能接触到测试集上的样本。因此模型如果将训练集学的过好,模型就会记住训练样本的细节,导致模型在训练集的泛化效果较差,这种现象称为过拟合。与过拟合相对应的是欠拟合,即模型在训练集上的拟合效果较差
    在这里插入图片描述
  • 如图所示:随着模型复杂度和模型训练轮数的增加,CNN模型在训练集上的误差会降低,但在测试集上的误差会逐渐降低,然后逐渐升高,而我们为了追求的是模型在测试集上的精度越高越好。导致模型过拟合的情况有很多种原因,其中最为常见的情况是模型复杂度太高,导致模型学习到了训练数据的方方面面,学习到了一些细节上的规律
  • 解决问题最好的办法:构建一个与测试集尽可能分布一致的样本集(可称为验证集),在训练过程中不断验证模型在验证集上的精度,并以此控制模型的训练
  • 在一般情况下,可以在本地划分出一个验证机出来,进行本地验证。训练集、验证集和测试集份别有不同的作用
    1.训练集:模型用于训练和调整模型参数
    2.验证集:用来验证模型精度和调整模型超参数
    3.测试集:验证模型的泛化能力
  • 因为训练集和验证集是分开的,所以模型在验证集上面的精度在一定程度上可以反映模型的泛化能力。在划分验证集的时候,需要注意验证集的分布应该与测试集尽量保持一致,不然模型在验证集上的精度就失去了指导意义

验证集的划分方式

  • 留出法Hold-Out:直接将训练集划分成两部分,新的训练集和验证集。这种划分方式的优点最为简单直接;缺点是只得到了一份验证集,有可能导致模型在验证集上过拟合。留出法应用场景是数据量比较大的情况
  • 交叉验证法Cross Validation:将训练集划分成K份,将其中的K-1份作为训练集,剩余的1份作为验证集,循环K训练。这种划分方式是所有的训练集都是验证集,最终模型验证精度是K份平均得到。这种方式的优点是验证集精度比较可靠。训练K次可以得到K个有多样性差异的模型;CV验证的缺点是需要训练K次,不适合数据量很大的情况
  • 自助采样法BootStrap:通过有放回的采样方式得到新的训练集和验证集,每次的训练集和验证集都是有区别的。这种划分方式一般适用于数据量较小的情况

模型训练与验证

  • 构造训练集和验证集
  • 每轮进行训练和验证,并根据最优验证集精度保存模型
train_loader = torch.utils.data.DataLoader(train_dataset,batch_size=10,shuffle=True,num_workers=10, 
)val_loader = torch.utils.data.DataLoader(val_dataset,batch_size=10,shuffle=False,num_workers=10, 
)model = SVHN_Model1()
criterion = nn.CrossEntropyLoss (size_average=False)
optimizer = torch.optim.Adam(model.parameters(), 0.001)
best_loss = 1000.0
for epoch in range(20):print('Epoch: ', epoch)train(train_loader, model, criterion, optimizer, epoch)val_loss = validate(val_loader, model, criterion)# 记录下验证集精度if val_loss < best_loss:best_loss = val_losstorch.save(model.state_dict(), './model.pt')
  • 其中每个Epoch的训练代码如下:
def train(train_loader, model, criterion, optimizer, epoch):# 切换模型为训练模式model.train()for i, (input, target) in enumerate(train_loader):c0, c1, c2, c3, c4, c5 = model(data[0])loss = criterion(c0, data[1][:, 0]) + \criterion(c1, data[1][:, 1]) + \criterion(c2, data[1][:, 2]) + \criterion(c3, data[1][:, 3]) + \criterion(c4, data[1][:, 4]) + \criterion(c5, data[1][:, 5])loss /= 6optimizer.zero_grad()loss.backward()optimizer.step()
  • 其中每个Epoch的验证代码如下:
def validate(val_loader, model, criterion):# 切换模型为预测模型model.eval()val_loss = []# 不记录模型梯度信息with torch.no_grad():for i, (input, target) in enumerate(val_loader):c0, c1, c2, c3, c4, c5 = model(data[0])loss = criterion(c0, data[1][:, 0]) + \criterion(c1, data[1][:, 1]) + \criterion(c2, data[1][:, 2]) + \criterion(c3, data[1][:, 3]) + \criterion(c4, data[1][:, 4]) + \criterion(c5, data[1][:, 5])loss /= 6val_loss.append(loss.item())return np.mean(val_loss)

模型保存与加载

  • Pytorch种模型的保存和加载非常简单,比较常见的做法是保存和加载模型参数:
	torch.save(model_object.state_dict(), 'model.pt')model.load_state_dict(torch.load(' model.pt'))

模型调参流程

  • 深度学习原理少但实践性非常强,基本上很多的模型的验证只能通过训练来完成同时深度学习有众多的网络结构和超参数,因此需要反复尝试。训练深度学习模型需要GPU的硬件支持,也需要较多的训练时间。
    在这里插入图片描述

小结

  • 以深度学习模型的训练和验证为基础,讲解了验证集划分方法、模型训练与验证、模型保存和加载以及模型调参流程
  • 需要注意的是模型复杂度是相对的,并不一定模型越复杂越好。

这篇关于Datawhale 零基础入门CV-Task04.模型训练与验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/639193

相关文章

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA