《深度学习》卷积神经网络 使用最优模型、调整学习率 用法解析及案例实现

目录

一、使用最优模型

1、什么是最优模型

2、如实使用最优模型

1)读取参数方法

2)调用完整模型方法

3)实例

完整代码:

打印结果:

二、调整学习率

1、什么是调整学习率

2、目的

3、调整学习率的方法

1)有序调整

2)自适应调整

参数解析

3)自定义调整

4、案例使用


一、使用最优模型

1、什么是最优模型

        在深度学习中,最优模型指的是在给定的任务上具有最好性能的模型。最优模型通常通过最小化损失函数来确定,该损失函数能够衡量模型在训练数据上的预测结果与真实结果之间的差异。

        最优模型具有较低的训练误差和有效的泛化能力,能够在未见过的测试数据上表现良好。为了找到最优模型,通常会使用优化算法,如梯度下降算法,来更新模型的参数,直到找到损失函数的最小值。最优模型的选择通常基于多个因素,如训练数据的质量和数量,模型的复杂性和计算资源的限制。

2、如实使用最优模型

        上节课我们已经通过寻找最优模型得到了当前训练的最优参数的模型,然后将这个模型保存在pt、pth、t7文件中,如下所示:

1)读取参数方法
model = CNN().to(device)
model.load_state_dict(torch.load("best.path"))   # 调用仅包含权重参数和偏置的模型
2)调用完整模型方法
#  2、读取完整模型的方法,无需提前创建model
# model = CNN().to(device)  # 将模型传入GPU,device为前面判断的
model = torch.load('best.pt')   # 调用前面保存的完整模型
3)实例

        依旧是上节课的数据,如下所示,代码只需小改一下即可

        完整代码:
import numpy as np
from torch.utils.data import Dataset,DataLoader
import torch
import torch.nn as nn
from PIL import Image
from torchvision import transformsdevice = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"from torch import nn
class CNN(nn.Module):def __init__(self):super(CNN,self).__init__()self.conv1=nn.Sequential(nn.Conv2d(in_channels=3,out_channels=16,kernel_size=5,stride=1,padding=2),nn.ReLU(),nn.MaxPool2d(kernel_size=2))self.conv2=nn.Sequential(nn.Conv2d(16,32,5,1,2),nn.ReLU(),nn.Conv2d(32, 32, 5, 1, 2),nn.ReLU(),nn.MaxPool2d(2))self.conv3=nn.Sequential(nn.Conv2d(32,64,5,1,2),nn.ReLU())self.out = nn.Linear(64*64*64,20)def forward(self,x):x = self.conv1(x)x = self.conv2(x)x = self.conv3(x)x = x.view(x.size(0),-1)output = self.out(x)# output = torch.sigmoid(x)return output# model = CNN().to(device)# 提取模型的两种方法
#  1、读取参数的方法
# model = CNN().to(device)
# model.load_state_dict(torch.load("best.path"))   # 调用仅包含权重参数和偏置的模型
#  2、读取完整模型的方法,无需提前创建model
# model = CNN().to(device)  # 将模型传入GPU,device为前面判断的
model = torch.load('best.pt')   # 调用前面保存的完整模型model.eval()   # 固定模型参数和数据,防止后面被修改
# 数据增强
data_transforms={'train':transforms.Compose([transforms.Resize([256,256]),transforms.RandomRotation(45),#随机旋转,-45到45度# transforms.CenterCrop(256),#从中心裁剪240*240transforms.RandomHorizontalFlip(p=0.5),#随机水平翻转transforms.RandomVerticalFlip(p=0.5),#随机垂直翻转transforms.ColorJitter(brightness=0.2,contrast=0.1,saturation=0.1,hue=0.1),transforms.RandomGrayscale(p=0.1),#转换为灰度图transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406],[0.229, 0.224, 0.225])]),'valid':transforms.Compose([transforms.Resize([256,256]),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])])
}# 取出数据
class food_dataset(Dataset):   # food_dataset是自己创建的类名称,可以改变你需要的名称def __init__(self,file_path,transform=None):self.file_path=file_pathself.imgs=[]self.labels=[]self.transform=transformwith open(self.file_path) as f:samples=[x.strip().split(' ') for x in f.readlines()]for sample in samples:self.imgs.append(sample[0])self.labels.append(sample[1:])def __len__(self):return len(self.imgs)def __getitem__(self, idx):image=Image.open(self.imgs[idx])if self.transform:image=self.transform(image)label=self.labels[idx]label=torch.from_numpy(np.array(label,dtype=np.float64))return image,label# 取出图片数据后对其进行打包
test_data = food_dataset(file_path='./testda.txt',transform = data_transforms['valid'])
test_dataloader = DataLoader(test_data,batch_size=1,shuffle=True)#
result=[]  # 保存的预测结果
labels=[]  # 真实结果
def test_true(dataloader,model):with torch.no_grad():  # 上下文管理器,关闭梯度运算for x,y in dataloader:   # 遍历打包好的图片及其标签x,y = x.to(device),y.to(device)  # 将其传入GPUpred = model.forward(x)   # 前向传播result.append(pred.argmax(1).item())   # 将预测值的结果转换成python变量然后增加到列表labels.append(y.item())  # 同时将真实值的标签转变成python标量然后存入labels列表test_true(test_dataloader,model)   # 导入数据和模型
print('预测值:\t',result)
print('真实值:\t',labels)
打印结果:

二、调整学习率

1、什么是调整学习率

        学习率是优化算法中一个重要的超参数,用于控制模型参数在每次更新时的调整幅度。学习率决定了模型在参数空间中搜索的步长大小。调整学习率是指在训练过程中根据需要改变学习率的值。

        常用的学习率有0.1、0.01以及0.001等,学习率越大则权重更新越快。一般来说,我们希望在训练初期学习率大一些,使得网络收敛迅速,在训练后期学习率小一些,使得网络更好的收敛到最优解。

2、目的

        调整学习率的目的是为了能够更好地优化模型,避免训练过程中出现的一些问题,如梯度爆炸梯度消失、训练过程陷入局部极小值

3、调整学习率的方法

        PyTorch学习率调整策略通过torch.optim.lr_sheduler接口实现,下图可发现不同方法调整学习率所对应的横轴epoch值与纵轴学习率的关系

        1)有序调整

                等间隔调整step、多间隔调整MultiStep、指数衰减Exponential、余弦退火CosineAnnealing

"""等间隔调整"""
torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1)
# optimizer: 神经网络训练中使用的优化器,
# 如optimizer = torch.optim.Adam(model.parameters(),lr=0.001)
# step_size(int): 学习率下降间隔数,单位是epoch,而不是iteration.
# gamma(float):学习率调整倍数,默认为0.1
# 每训练step_size个epoch,学习率调整为lr=lr*gamma."""多间隔调整调整"""
torch.optim.lr_shceduler.MultiStepLR(optimizer, milestones, gamma=0.1)
# milestone(list): 一个列表参数,表示多个学习率需要调整的epoch值,
# 如milestones=[10, 30, 80],即10轮时将gamma乘以学习率lr,30轮时、80轮时、、"""指数衰减"""
torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma)
# gamma(float):学习率调整倍数的底数,指数为epoch,初始值我lr, 倍数为γepoch,每一轮都调整"""余弦退火"""
torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0)
# Tmax(int):学习率下降到最小值时的epoch数,即当epoch=T_max时,学习率下降到余弦函数最小值,# 当epoch>T_max时,学习率将增大;
# etamin: 学习率调整的最小值,即epoch=Tmax时,lrmin=etamin, 默认为0.
        2)自适应调整

                依训练状况伺机而变,通过检测某个指标的变化情况(如loss、accuracy),当该指标不怎么变化时,就是调整学习率的时机。

"""根据指标调整学习率"""
torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1,patience=10,verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
参数解析
  • optimizer:是优化器,例如SGD、Adam等。
  • mode:用于指示评估指标的变化方向。"min"表示评估指标越小越好,"max"表示评估指标越大越好。
  • factor:学习率缩放因子,每次调整学习率时,将学习率乘以factor。
  • patience:在模型没有显著改善时,经过多少个epoch才进行调整。
  • verbose:是否打印每次学习率调整的信息。
  • threshold:评估指标的变化阈值,控制何时进行学习率调整。
  • threshold_mode:用于指示threshold是"rel"相对于最好的评估指标还是"abs"绝对值。
  • cooldown:在学习率调整之后,经过多少个epoch才恢复正常操作。
  • min_lr:学习率的下限,不会再低于该值。
  • eps:一个很小的值,用于避免除以零错误。

        3)自定义调整

                通过自定义关于epoch的lambda函数调整学习率lambdaLR

torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda)
# lr_lambda(function or list): 自定义计算学习率调整倍数的函数,通常时epoch的函数,当有多个参数组时,设为list.

4、案例使用

        只需将上节课中训练模型的代码拿过来更改最后一小部分即可,首先在创建交叉熵损失函数下再创建一个更改学习率的接口,然后在进行每轮的训练时插入这个接口即可。

loss_fn = nn.CrossEntropyLoss()    # 创建交叉熵损失雨数对象
optimizer = torch.optim.Adam(model.parameters(),lr=0.001)   #创建一个优化器,一开始lr可以大一些
scheduler = torch.optim.lr_scheduler.StepLR(optimizer,step_size=5,gamma=0.5)  # 调整学习率
"""optimizer是一个PyTorch优化器对象
step_size表示学习率调整的步长
gamma表示学习率的衰减因子,即每次调整后将当前学习率乘以gamma
""""""训练模型"""
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)epochs = 80
acc_s = [] 
loss_s = []for t in range(epochs):print(f"Epoch {t+1}\n---------------------------")train(train_dataloader,model,loss_fn,optimizer)test(test_dataloader, model, loss_fn)scheduler.step()
print(bast_acc)

        前面部分的代码可以参考之前的博客,如下链接

《深度学习》CNN 数据增强、保存最优模型 实例详解icon-default.png?t=O83Ahttps://ahao1004.blog.csdn.net/article/details/142498728?fromshare=blogdetail&sharetype=blogdetail&sharerId=142498728&sharerefer=PC&sharesource=qq_64603703&sharefrom=from_link

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 语言课程笔记

C 语言课程笔记 C语言程序设计第四版——谭浩强著,此书中的代码题大部分已经在本文中展示,以及南开大学 C 语言上机题库 100 题的作答,如果有作答不正确的地方或者可优化的地方,欢迎指正,谢谢! 001 屏幕输出…

DAMODEL丹摩智算平台实践CogVideoX

文章目录 前言 一、平台账号注册并登录 二、部署CogVideoX (一)简介 (二)部署 1. 创建实例 2. 配置环境和依赖 3.预制模型与配置文件 三、开始运行 总结 前言 该文章主要记录DAMODEL丹摩智算平台实践过程与心得体会&…

【YashanDB知识库】客户端字符集与数据库字符集兼容问题

本文转自YashanDB官网,具体内容请见https://www.yashandb.com/newsinfo/7352675.html?templateId1718516 问题现象 客户端yasql配置字符集为GBK,服务端yasdb配置字符集为UTF8,之后执行语句: 会发现: 期望是两个都…

FAT32取证分析

前言: 在正常工作中经常会有数据恢复或者取证分析的场景,数据是否能被恢复,主要还是看数据是否被覆盖,正常情况下文件虽然被删除,只是修对应的标志位,文件本身数据并不会被破坏,所以我们就可以…

【Java】1.初识Java

文章目录 1. 使用记事本创建.Java程序2. 使用IDEA创建第一个Java程序3. 标识符4. 关键字 1. 使用记事本创建.Java程序 先创建了HelloWorld.java这个文件。然后用Sublime Text记事本打开,输入以下代码。 winr,cmd输入D:切换到D盘,然后输入cd …

投资气膜场馆:开启未来体育发展的新纪元—轻空间

随着对体育设施建设的重视,气膜场馆作为一种创新的体育设施,正日益成为投资的热门选择。气膜场馆凭借其独特的优势和多重好处,不仅能提升体育场馆的功能性和经济性,更为地方经济发展注入了新的活力。 成本效益显著 气膜场馆具有快…

419. 棋盘上的战舰(C++)

题目 给你一个大小为 m x n 的矩阵 board 表示棋盘,其中,每个单元格可以是一艘战舰 X 或者是一个空位 . ,返回在棋盘 board 上放置的 舰队 的数量。 舰队 只能水平或者垂直放置在 board 上。换句话说,舰队只能按 1 x k&#xff…

SimpleAIAgent:使用免费的glm-4-flash即可开始构建简单的AI Agent应用

SimpleAIAgent是基于C# Semantic Kernel 与 WPF构建的一款AI Agent探索应用。主要用于使用国产大语言模型或开源大语言模型构建AI Agent应用的探索学习,希望能够帮助到感兴趣的朋友。 接下来我想分享一下我的AI Agent应用实践。 翻译文本并将文本存入文件 第一个…

Transformer入门指南!14天速成

想系统而又透彻地入门和学习Transformer,可以按照以下思路(步骤): 1、首先,了解一些NLP领域的基本知识,比如文本是如何被表征的,序列文本信息的处理,基于(深度神经网络)的语言模型是如何处理自然语言的; 2、Transfor…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-21

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-21 1. AIvril: AI-Driven RTL Generation With Verification In-The-Loop Authors: Mubashir ul Islam, Humza Sami, Pierre-Emmanuel Gaillardon, and Valerio Tenace AIVRIL: 人工智能驱动的RTL生成与验证内…

表观项目文章速递,平均IF=9.7

表观组学是研究基因组层面的表观遗传变化及其调控机制的一门学科,它在现代生物学研究中具有重要意义。传统的遗传学研究主要关注DNA序列的变化,而表观组学则着眼于在不改变DNA序列的情况下,如何通过化学修饰和染色质结构的改变进而影响基因表…

【开源免费】基于SpringBoot+Vue.JS墙绘产品展示交易平台(JAVA毕业设计)

本文项目编号 T 049 ,文末自助获取源码 \color{red}{T049,文末自助获取源码} T049,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

Windows 10 on ARM, version 22H2 (updated Sep 2024) ARM64 AArch64 中文版、英文版下载

Windows 10 on ARM, version 22H2 (updated Sep 2024) ARM64 AArch64 中文版、英文版下载 基于 ARM 的 Windows 10 请访问原文链接:https://sysin.org/blog/windows-10-arm/,查看最新版。原创作品,转载请保留出处。 作者主页:s…

Ansible-playbook使用roles

文章目录 一、Ansible的内置目录及文件总览目录及文件解释production目录staging目录host_vars目录和group_vars目录library目录、module_utils目录、filter_plugins目录site.ymlroles目录roles/自定义角色名目录下roles/自定义角色名目录/tasks目录下roles/自定义角色名目录/h…

NLP技术在营业选址中的实践与探索

传统营业选址面临的问题 在电信业务的服务流程中,用户装机地址的准确性和清晰度对于整个服务体验和运营效率起着至关重要的作用。然而,在实际操作中,装机地址的确定往往面临诸多挑战,这些问题不仅影响用户的服务体验,也…

详解机器学习经典模型(原理及应用)——逻辑回归

一、什么是逻辑回归 逻辑回归模型是经典的统计模型,主要用于处理二分类问题(预测一个事件发生与否的概率)。得益于其简单性和高度可解释性,逻辑回归在业务中常被用作baseline之一。即便是上亿量级的数据,也能够在很短的…

Gattchart使用手册

一.组件概述 GanttChart是Delphi的一个交互式非数据库感知前端VCL组件,可以在gantt图表中可视化任务。该组件可用于调度许多资源和任务,并可用于多种项目场景,如项目管理、任务管理、生产调度或员工调度。该组件包括用于不同数据类型的pert图…

应用层 IV(万维网WWW)【★★】

(★★)代表非常重要的知识点,(★)代表重要的知识点。 一、WWW 的概念与组成结构 1. 万维网的概念 万维网 WWW(World Wide Web)并非某种特殊的计算机网络。万维网是一个大规模的、联机式的信息…

MSF工具使用教程

Metasploit 简介 Metasploit 是一个漏洞框架,拥有超过 1700 个漏洞利用程序,大大简化了渗透测试的工作,同时具有模块化的体系结构,渗透测试人员可以很方便的添加或修改exploit。 安装及维护 安装 使用 Rapid7 的一套快速安装项…

18769 不完整的排序

### 思路 1. 读取输入数据,获取T组数据。 2. 对每组数据,使用双指针法进行排序: - 定义两个指针 i 和 j,分别从数组的左端和右端开始。 - 当 i 指向正数且 j 指向负数时,交换它们。 - 移动指针,直…