深度学习调参基础

文章目录

  • 深度学习调参基础
    • 1.需要调节的超参数有哪些?
    • 2.什么时候需要调参?
    • 3.如何调参?
      • 3.1过拟合情况调参
      • 3.2欠拟合情况调参
      • 3.3收敛但震荡情况调参
      • 3.4不收敛情况调参
    • 4.调参示例
    • 参考

深度学习调参基础

1.需要调节的超参数有哪些?

  • 和网络结构相关的参数:神经网络的网络层数、不同层的类别和搭建顺序、隐藏层神经元的参数设置、LOSS层的选择、正则化参数
  • 和训练过程相关的参数:网络权重初始化方法、学习率使用策略、迭代次数、Batch的大小、输入数据相关

2.什么时候需要调参?

QQ_1720585309283

  • 恰好拟合(一般不需要调参)
  • 过拟合
  • 欠拟合
  • 收敛但震荡
  • 不收敛

3.如何调参?

3.1过拟合情况调参

  • 增加数据量。收集更多的训练数据,或者通过数据增强(Data Augmentation)的方法来增加数据量。
  • 使用正则化技术。L1或L2正则化、Dropout、早停(Early Stopping)
  • 减少模型复杂度。减少模型的参数数量,例如减少层数或者每层的神经元数量。
  • 使用交叉验证。通过交叉验证来评估模型性能,选择最佳的超参数。
  • 调整学习率。使用学习率衰减(Learning Rate Decay)来逐步减小学习率,从而让模型在训练后期更稳定。
  • 调整批量大小。增加或减少批量大小(Batch Size),不同的数据集和模型可能需要不同的批量大小来达到最优效果。

3.2欠拟合情况调参

  • 增加模型复杂度。增加神经网络的层数或每层的神经元数量。
  • 训练更长时间。增加训练轮数(Epochs)
  • 调整学习率。适当增加学习率,以加快模型的收敛速度。
  • 减少正则化。减少或移除正则化项(例如L2正则化),以允许模型在训练数据上拟合得更好。降低或移除Dropout层,以减少训练过程中神经元的随机丢弃。
  • 优化数据处理。确保数据预处理和归一化步骤没有问题,使数据分布适合模型训练。
  • 使用更大的批量大小。

3.3收敛但震荡情况调参

  • 降低学习率。学习率过高可能导致模型在收敛过程中震荡。适当降低学习率,模型的更新步骤会变小,从而有助于稳定收敛。
  • 使用学习率调度器(如学习率衰减、余弦退火等)来动态调整学习率。
  • 增加批量大小。
  • 使用梯度裁剪。对梯度进行裁剪(Gradient Clipping),将梯度的最大范数限制在一个固定值以内,防止梯度爆炸和震荡。
  • 增加正则化。增加L2正则化或者增加Dropout的比例,可以使模型的权重更新更为平滑,从而减少震荡。
  • 确保数据没有问题,数据预处理和归一化步骤正确。
  • 适当简化模型架构,减少过深或过宽的网络结构。

3.4不收敛情况调参

  • 增加或降低学习率。学习率过高可能导致模型参数更新过大,无法收敛。学习率过低,模型可能收敛得太慢或者陷入局部极小值。
  • 增加或降低模型复杂度。模型过于简单,无法拟合数据。模型过于复杂,难以训练。
  • 改变激活函数。使用不同的激活函数,如ReLU、Leaky ReLU、ELU、Swish等。
  • 调整优化器。尝试不同的优化器,如Adam、RMSprop、SGD with Momentum等。
  • 增加批量大小。
  • 增加训练次数。
  • 使用合适的权重初始化方法,如He初始化或Xavier初始化,确保模型在训练初期不会因为不合理的权重导致无法收敛。

4.调参示例

补充知识:

len(dataloader):返回batch的数量,即一个数据集总共有多少个 batch。

len(dataloader.dataset):返回数据集中样本的数量,即 dataset 的长度。

"""
coding:utf-8
* @Author:FHTT-Tian
* @name:Adjust Parameter.py
* @Time:2024/7/10 星期三 16:39
* @Description: 调参示例代码,未调参之前
"""# 手写数字识别数据集mnist
import torch
import torchvision.datasets as dataset
import torchvision.transforms as transforms
from matplotlib import pyplot as plt
from torch import nn, optim
from torch.utils.data import DataLoader# 定义超参数
batch_size = 64
hidden_size = 64  # 神经元个数
learning_rate = 0.001
num_epochs = 10
input_size = 784  # 28*28
num_classes = 10# 定义存放loss的列表
train_loss_list = []
test_loss_list = []# 对图片进行预处理
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,), )])# 下载数据集并预处理
trainset = dataset.MNIST(root="./MINST", train=True, download=True, transform=transform)
testset = dataset.MNIST(root="./MINST", train=False, download=True, transform=transform)# dataloader设置,加载数据集
train_loader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=False)# 构建网络
class Net(nn.Module):def __init__(self, input_size, hideen_size, num_classes):super().__init__()self.fc1 = nn.Linear(input_size, hideen_size)self.relu = nn.ReLU()self.fc2 = nn.Linear(hideen_size, num_classes)def forward(self, x):out = self.fc1(x.view(-1, input_size))out = self.relu(out)out = self.fc2(out)return out# 网络实例化
model = Net(input_size, hidden_size, num_classes)# 定义损失
criterion = nn.CrossEntropyLoss()# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=learning_rate)# 训练
total_step = len(train_loader)  # len(dataloader):返回batch的数量,即一个数据集总共有多少个batch
for epoch in range(num_epochs):for i, (images, labels) in enumerate(train_loader):outputs = model(images)loss = criterion(outputs, labels)optimizer.zero_grad()loss.backward()optimizer.step()train_loss_list.append(loss.item())  # train_loss_list 里面存的是每个batch对应的loss,loss.item() 返回的是当前批次的损失值。if (i + 1) % 100 == 0:print("Epoch [{}/{}], Step [{}/{}], Train Loss:{:.4f}".format(epoch + 1, num_epochs, i + 1, total_step,loss.item()))# 设置模型为评估模式model.eval()with torch.no_grad():test_loss = 0.0for images, labels in test_loader:outputs = model(images)loss = criterion(outputs, labels)test_loss += loss.item() * images.size(0)  # 当前批次的损失乘以该批次的样本数,然后累加到 test_loss。为了计算整个测试数据集的总损失# len(dataloader.dataset):返回数据集中样本的数量,即dataset的长度。将累加的总损失除以测试数据集的总样本数,以获得平均损失。test_loss /= len(test_loader.dataset)test_loss_list.extend([test_loss] * total_step)  # 将平均测试损失值 test_loss 复制成长度为 total_step 的列表# 设置模型为训练模式model.train()print("Epoch [{}/{}], Test Loss:{:.4f}".format(epoch + 1, num_epochs, test_loss))# 绘制训练与测试的loss曲线
plt.plot(train_loss_list, label="Train Loss")
plt.plot(test_loss_list, label="Test Loss")
plt.title("Model Loss")
plt.xlabel("Iterations")
plt.ylabel("Loss")
plt.legend()
plt.show()

image-20240710210858471

  • 将SGD优化器改为Adam优化器查看模型效果:
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

image-20240710212008854

  • batch_size修改为128,learning_rate修改为0.0001,查看模型的效果。

image-20240710212648519

总结:如果出现过拟合、欠拟合、收敛但震荡或不收敛的情况,尝试使用相应的调参方法进行调整,以期得到较好的结果。建议在一个好的骨干网络下修改模型,这样大多数参数已经调得很好,不需要我们调整。因此,主要任务是添加模块,如果效果不佳,则更换模块✌。

参考

  • 炼丹笔记六 : 调参技巧
  • 自动调参工具Optuna
  • Pytorch 数据加载—Dataset和DataLoader详解

😃😃😃

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

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

相关文章

类与对象(2)

我们在了解了类的简单创建后,需要对类的创建与销毁有进一步的了解,也就是对于类的构造函数与析构函数的了解。 目录 注意: 构造函数的特性: 析构函数: 注意: 该部分内容为重难点内容,在正常…

Ae After Effects2024 for Mac 视频处理软件

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、Anticc简化版安装1.1双击运行软件,安装1.2 解决来源身份不明的开发者问题1.3 再次运行软件,即可进行AntiCC安装 2. Ae2024安装2.1 打开 Ae 2024 安装包组2.2 将 Ae 安装包拖至桌面2.3 安装 Ae2024 &…

溶解氧(DO)理论指南(3)

转载自梅特勒官网资料,仅用于学习交流,侵权则删! 溶解氧理论指南 设备操作3.1 DO电极准备3.2 DO电极校准3.3 进行DO测量3.4 转换单位3.5 维护和储存 设备操作 本章总结了 DO电极日常使用的一些建议。它们基于普遍接受的操作规则。 3.1 DO电…

【Nvidia+AI相机】涂布视觉检测方案专注提高锂电池质量把控标准

锂电池单元的质量在多个生产制造领域都至关重要,特别是在新能源汽车、高端消费电子等行业。这些领域的产品高度依赖锂电池提供持续、稳定的能量供应。优质的锂电池单元不仅能提升产品的性能和用户体验,还能确保使用安全。因此,保证锂电池单元…

【C语言之高级编程】如何将指定变量或函数编译至固定的内存区域中?

如何将指定变量或函数编译至固定的内存区域? 1. 内存类型1.1 bss段(Block Started by Symbol)1.2 data段(data segment)1.3 text段(code segment/text segment)1.4 dec1.5 堆(heap&a…

【人工智能】Transformers之Pipeline(概述):30w+大模型极简应用

​​​​​​​ 目录 一、引言 二、pipeline库 2.1 概述 2.2 使用task实例化pipeline对象 2.2.1 基于task实例化“自动语音识别” 2.2.2 task列表 2.2.3 task默认模型 2.3 使用model实例化pipeline对象 2.3.1 基于model实例化“自动语音识别” 2.3.2 查看model与task…

谷粒商城学习笔记-22-分布式组件-SpringCloud-OpenFeign测试远程调用

文章目录 一,OpenFeign的简介二,OpenFeign的使用步骤1,场景说明2,引入依赖2,开启OpenFeign3,编写Feign接口4,使用feign调用远程接口5,验证 错误记录 上一节学习了注册中心&#xff0…

区块链论文速读A会-ISSTA 2023(2/2)如何检测DeFi协议中的价格操纵漏洞

Conference:ACM SIGSOFT International Symposium on Software Testing and Analysis (ISSTA) CCF level:CCF A Categories:Software Engineering/System Software/Programming Languages Year:2023 第1~5篇区块链文章 请点击此…

讲讲 JVM 的内存结构(附上Demo讲解)

讲讲 JVM 的内存结构 什么是 JVM 内存结构?线程私有程序计数器​虚拟机栈本地方法栈 线程共享堆​方法区​注意永久代​元空间​运行时常量池​直接内存​ 代码详解 什么是 JVM 内存结构? JVM内存结构分为5大区域,程序计数器、虚拟机栈、本地…

用SurfaceView实现落花动画效果

上篇文章 Android子线程真的不能刷新UI吗?(一)复现异常 中可以看出子线程更新main线程创建的View,会抛出异常。SurfaceView不依赖main线程,可以直接使用自己的线程控制绘制逻辑。具体代码怎么实现了? 这篇文章用Surfa…

C++入门基础篇(下)

目录 6.引用 6.1 引用的特性 6.2 const引用 7.指针和引用的关系 8.内联函数 9.nullptr 6.引用 引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。比如&a…

Linux系统(Centos)下MySQL数据库中文乱码问题解决

问题描述:在进行数据库使用过程中,数据库里的数据中文都显示乱码。操作数据库的时候,会出现中文乱码问题。 解决方法如下: 第一步:打开虚拟机进入系统,启动MySQL。 第二步:连接登录MySQL输入…

2.5 C#视觉程序开发实例1----IO_Manager实现脉冲输出控制

2.5 C#视觉程序开发实例1----IO_Manager实现脉冲输出控制 1 目标效果视频 目标效果展示 IO_Manager 2 信号输出流程说明 为了防止线程不同步导致输出信号没有被输出, 尽量使用一个输出队列来进行输出的管理 3 IO_Manager中添加内容 3.0 添加两个类 1 Out_Sta…

idea中打开静态网页端口是63342而不是8080

问题: 安装了tomcat 并且也配置了环境,但是在tomcat下运行,总是在63342下面显示。这也就意味着,并没有运行到tomcat环境下。 找了好几个教程(中间还去学习了maven,因为跟的教程里面,没有maven,但…

C++ STL IO流介绍

目录 一:IO流的继承关系: 二:输入输出功能 1. 基本用法 2. 格式化输入 3.非格式化输入 4. 格式化输出 三:流 1. 字符流 2. 向字符流中写入数据 3. 从字符流中读出数据 4. 清空字符流 5.完整的例子 四:文件…

php快速入门

前言 php是一门脚本语言,可以访问服务器,对数据库增删查改(后台/后端语言) 后台语言:php,java,c,c,python等等 注意:php是操作服务器,不能直接在…

数据结构(3.8)——栈的应用

栈在括号匹配中的应用 流程图 代码 #include <stdio.h> #include <stdlib.h> #define MaxSize 10typedef struct {char data[MaxSize];int top; } SqStack;// 初始化栈 void InitStack(SqStack* S) {S->top -1; // 初始化栈顶指针 }// 判空 bool StackEmpty(…

设计模式探索:观察者模式

1. 观察者模式 1.1 什么是观察者模式 观察者模式用于建立一种对象与对象之间的依赖关系&#xff0c;当一个对象发生改变时将自动通知其他对象&#xff0c;其他对象会相应地作出反应。 在观察者模式中有如下角色&#xff1a; Subject&#xff08;抽象主题/被观察者&#xf…

C++第四弹 -- 类与对象(中上) (构造函数 析构函数 拷贝构造函数)

目录 前言构造函数1. 概念2. 特征 析构函数1. 概念2. 特征 拷贝构造函数1. 概念2. 特征 总结 前言 让我们一起揭开 C 对象生命周期管理的神秘面纱&#xff0c;掌握构造函数、析构函数和拷贝构造函数的精髓&#xff01; 博客主页: 酷酷学!!! 期待更多好文, 点击关注~ 构造函…

【Neo4j】实战 (数据库技术丛书)学习笔记

Neo4j实战 (数据库技术丛书) 第1章演示了应用Neo4j作为图形数据库对改进性能和扩展性的可能性, 也讨论了对图形建模的数据如何正好适应于Neo4j数据模型,现在到了该动 手实践的时间了。第一章 概述 Neo4j将数据作为顶点和边存储(或者用Neo4j术语,节点和关系存 储)。用户被定…