深度学习常用方法(一)

1. Dropout 的原理

Dropout 是一种防止神经网络过拟合(学习得过于复杂,导致泛化能力差)的方法。

  • 原理:在每次训练时,随机“丢弃”一部分神经元(即暂时让它们失效,设置为零),让网络无法过度依赖某些特定神经元。测试时则不会丢弃。
  • 通俗类比:想象一个篮球队总是依赖明星球员。如果让明星球员随机休息,其他队员会被迫提高自己的能力,这样整个团队会变得更强。
适合应用场景
  • 用于全连接层(Fully Connected Layer),尤其是在模型容易过拟合的情况下。
  • 不适合用于卷积层,因为卷积层权重共享,丢弃局部特征可能会破坏结构。
import torch
import torch.nn as nn
import torch.nn.functional as F# 定义一个简单的模型,包含 Dropout
class DropoutModel(nn.Module):def __init__(self):super(DropoutModel, self).__init__()self.fc1 = nn.Linear(784, 256)   # 全连接层,输入为 784 (例如 28x28 的图像)输出为256self.dropout = nn.Dropout(p=0.5) # Dropout 层,概率为 0.5self.fc2 = nn.Linear(256, 10)   # 输出层,输出为 10 类(例如数字分类)def forward(self, x):x = F.relu(self.fc1(x))         # 激活函数x = self.dropout(x)            # 应用 Dropoutx = self.fc2(x)                # 输出层,return x# 创建模型实例
dropout_model = DropoutModel()
print(dropout_model)
  • 关键点:
    • nn.Dropout(p=0.5)p 是丢弃的概率,默认为 0.5。
    • 测试时,Dropout 自动关闭,不需要额外设置。

 

2. Batch Normalization(Batch Norm)的原理

Batch Norm 是一种加速训练和提高模型稳定性的方法。

  • 原理:对每一层的输入进行归一化处理,使其分布更平滑(均值为 0,标准差为 1),并引入两个可学习参数(缩放和偏移)来保持灵活性。这减少了梯度消失或爆炸的风险,同时加速了收敛。
  • 通俗类比:想象一个团队中的人能力差异很大。通过培训(归一化)让每个人能力大致相当,这样分配任务时效率会更高。
适合应用场景
  • 在深层网络的卷积层和全连接层中都适用,尤其是对输入的变化敏感的层。
  • 常用于深度卷积网络(如 ResNet 等),帮助稳定训练。

Dropout 和 Batch Norm 的区别

特性DropoutBatch Normalization
目的防止过拟合,增强泛化能力加速训练,提高稳定性,减少梯度问题
实现方式随机丢弃神经元对每层输入做归一化
使用场景主要用于全连接层适用于全连接层和卷积层
训练和测试区别测试时关闭 Dropout(使用缩放后的权重)测试时使用固定均值和方差
副作用可能降低网络容量额外引入计算开销和参数

 总结

  • Dropout 更注重防止过拟合,Batch Norm 更关注训练的速度和稳定性。
  • 在实际应用中,两者可以结合使用:Dropout 多用于全连接层,Batch Norm 多用于卷积层。
  • 根据场景需求,还可以选择其他正则化方法或训练加速策略,如 Layer Norm、数据增强等,灵活搭配效果更佳。
# 定义一个简单的模型,包含 Batch Normalization
class BatchNormModel(nn.Module):def __init__(self):super(BatchNormModel, self).__init__()self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)  # 卷积层self.bn1 = nn.BatchNorm2d(16)  # Batch Norm 层(针对卷积层输出的特征图)self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)self.bn2 = nn.BatchNorm2d(32)self.fc1 = nn.Linear(32 * 8 * 8, 128)self.bn_fc = nn.BatchNorm1d(128)  # Batch Norm 层(针对全连接层输出)def forward(self, x):x = F.relu(self.bn1(self.conv1(x)))  # 卷积 + Batch Norm + 激活x = F.relu(self.bn2(self.conv2(x)))  # 卷积 + Batch Norm + 激活x = F.adaptive_avg_pool2d(x, (8, 8))  # 自适应平均池化x = x.view(x.size(0), -1)            # 展平特征图x = F.relu(self.bn_fc(self.fc1(x)))  # 全连接层 + Batch Norm + 激活return x# 创建模型实例
batchnorm_model = BatchNormModel()
print(batchnorm_model)

 关键点:

  • 对卷积层使用 nn.BatchNorm2d(num_features)num_features 是卷积输出的通道数。
  • 对全连接层使用 nn.BatchNorm1d(num_features)num_features 是输出的特征数。
  • 测试时,Batch Norm 会固定均值和方差,不需要手动调整。

结合 Dropout 和 Batch Norm 的完整模型

 

class CombinedModel(nn.Module):def __init__(self):super(CombinedModel, self).__init__()self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)self.bn1 = nn.BatchNorm2d(16)self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)self.bn2 = nn.BatchNorm2d(32)self.fc1 = nn.Linear(32 * 8 * 8, 128)self.bn_fc = nn.BatchNorm1d(128)self.dropout = nn.Dropout(p=0.5)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = F.relu(self.bn1(self.conv1(x)))x = F.relu(self.bn2(self.conv2(x)))x = F.adaptive_avg_pool2d(x, (8, 8))x = x.view(x.size(0), -1)x = F.relu(self.bn_fc(self.fc1(x)))x = self.dropout(x)  # 在全连接层使用 Dropoutx = self.fc2(x)return x# 创建模型实例
combined_model = CombinedModel()
print(combined_model)
  • 结合使用:
    • Dropout 常用于全连接层,减少过拟合。
    • Batch Norm 用于卷积层和全连接层,提高训练效率和稳定性。

 训练代码框架

# 假设输入图像尺寸为 3x32x32
x = torch.randn(16, 3, 32, 32)  # 16 个样本的批次# 初始化模型
model = CombinedModel()# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)# 模拟前向传播
outputs = model(x)
labels = torch.randint(0, 10, (16,))  # 随机生成 16 个标签
loss = criterion(outputs, labels)# 反向传播和优化
loss.backward()
optimizer.step()print(f"Loss: {loss.item():.4f}")

 


其他类似作用的方法

  1. Layer Normalization (LN):

    • 类似于 Batch Norm,但作用在每一层的神经元输出,而不是 Batch 中的样本。
    • 更适合 RNN 等小批量训练场景。
  2. Group Normalization (GN):

    • 将神经元划分为小组,每组独立归一化。
    • 适用于小批量或分布式训练,尤其是计算资源有限时。
  3. Weight Decay (权重衰减):

    • 在优化过程中,对权重引入 L2 正则化,防止过拟合。
  4. Early Stopping (提前停止):

    • 监控验证集的性能,当验证集性能不再提升时停止训练。
  5. Data Augmentation (数据增强):

    • 增加数据的多样性,比如对图片翻转、裁剪、添加噪声等,防止模型过拟合。
  6. Mixup:

    • 将不同样本的数据和标签随机线性混合,从而增强训练数据的多样性。
  7. Stochastic Depth:

    • 在 ResNet 这种深层网络中,随机让一些残差块“跳过”,从而达到类似 Dropout 的效果。

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

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

相关文章

C++趣味编程:基于树莓派Pico的模拟沙漏-倾斜开关与LED的互动实现

沙漏,作为一种古老的计时工具,利用重力让沙子通过狭小通道,形成了计时效果。在现代,我们可以通过电子元件模拟沙漏的工作原理。本项目利用树莓派Pico、倾斜开关和LED,实现了一个电子沙漏。以下是项目的详细技术解析与C++代码实现。 一、项目概述 1. 项目目标 通过倾斜开关…

【Oracle】个人收集整理的Oracle常用SQL及命令

【建表】 create table emp( id number(12), name nvarchar2(20), primary key(id) ); 【充值一】 insert into emp select rownum,dbms_random.string(*,dbms_random.value(6,20)) from dual connect by level<101; 【充值二】 begin for i in 1..100 loop inser…

RAG (Retrieval Augmented Generation) 检索增强和生成

1 RAG技术简介 1.1 RAG技术概述 RAG&#xff08;Retrieval Augmented Generation&#xff09; 是一种结合了检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generation&#xff09;的技术&#xff0c;旨在通过利用外部知识库来增强大型语言模型&#xff08;LLMs&am…

Android 编译和使用libheif

项目中需要使用libheif,libde265,libyuv。一下是相应的cmakelist.txt。这里直接使用了静态库。 里面涉及到c包的链接&#xff0c;需要stdc。 ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/liblibde265.a这个路径由于操作过程中copy出现问题&#xff0c;多了一层路径&…

【无标题】多模态对齐

第一章 绪论 1.1 研究背景和意义 在现实生活中,人类往往是以事件为单位来认识和理解世界的,一个事件包 含了时间、地点、参与者等多个静态因素。将这些事件信息从非结构化数据中提 取出来,已逐渐成为信息抽取领域的关键任务之一。事件通常并非孤立存在,而 是彼此关联,它…

DIY-Tomcat part 3 实现对动态资源的请求

实现ServletRequest package connector;import javax.servlet.RequestDispatcher; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i…

黑马程序员Java笔记整理(day05)

1.面向对象编程 2.用法 3.对象是什么 4.对象在计算机中是啥 5.无参与有参构造器 小结: 6.this的作用 7.小结 8.封装 9.小结 10.实体类 11.小结 12.static 13.小结 14.static修饰方法 15.static应用前景 16.几个注意事项 17.java中可以直接用类的名字创建数组&#xff0c;如: M…

Perforce SAST专家详解:自动驾驶汽车的安全与技术挑战,Klocwork、Helix QAC等静态代码分析成必备合规性工具

自动驾驶汽车安全吗&#xff1f;现代汽车的软件包含1亿多行代码&#xff0c;支持许多不同的功能&#xff0c;如巡航控制、速度辅助和泊车摄像头。而且&#xff0c;这些嵌入式系统中的代码只会越来越复杂。 随着未来汽车的互联程度越来越高&#xff0c;这一趋势还将继续。汽车越…

《Python基础》之数据加密模块hashlib的用法

目录 一、简介 二、用法 步骤一、导入hashlib库 步骤二、创建哈希对象 步骤三、往哈希对象中传值 1、可以在创建对象的时候传值 2、使用updata传值 步骤四、获取经过哈希对象加密后的值 三、注意事项 1、编码问题 2、安全性 3、多次传值 四、总结 一、简介 hashli…

QT实战--qt各种按钮实现

本篇介绍qt一些按钮的实现&#xff0c;包括正常按钮&#xff1b;带有下拉箭头的按钮的各种实现&#xff1b;按钮和箭头两部分分别响应&#xff1b;图片和按钮大小一致&#xff1b;图片和按钮大小不一致的处理&#xff1b;文字和图片位置的按钮 效果图如下&#xff1a; 详细实现…

恶补英语初级第12天,《描述进行中的动作》

对话 Where’s Sally, Jack? She’s in the garden, Jane. What’s she doing? she’s sitting under the tree. Is Tim in the garden, too? Yes, he is. He’s climbing the tree. I beg your pardon? Who’s climbing the tree? Tim is. What about the dog? The dog’…

联表查询,外键

联表查询 使用多表可以减少冗余&#xff0c;便于增删改操作&#xff0c;查询操作复杂 表与表之间通过主键和外键关联 外键 如果一张表的某个列指向另一个表的主键列 &#xff0c;就称之为外键列 -- 添加外键 alter table t_emp add constraint 外键名 foreign key (depart)…

【OJ】前K个高频单词和单词识别和两个数组的交集

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 692. 前K个高频单词1.1 分析1.2 代码 2. KY264 单词识别2.1 分析2.2 代码 3. 349. 两个数组的交集3.1 分析3.2 代码 1. 692. 前K个高频单词 1.1 分析 先试用map来统计每个单词出现的次数&#xff1a; map<string,i…

分布式协同 - 分布式锁一二事儿

文章目录 导图Pre概述概述1. 分布式互斥和临界资源的协调2. 分布式锁的基本原理3. 分布式锁的实现方式a. 基于数据库实现的分布式锁b. 基于Redis实现的分布式锁c. 基于Zookeeper实现的分布式锁 4. 高并发场景下的分布式锁优化a. 分段锁&#xff08;Sharded Locks&#xff09;b.…

Vue-01

Vue框架 Vue官网&#xff1a; Vue.js 框架 数据模型和view的通信就是依靠viewmodel的关键。 目前主流版本仍然是vue2版本。 Vue快速入门 1.新建一个HTML文件&#xff0c;引入Vue.js文件。Vue.js文件是官方引入的一个文件&#xff0c;我们如果要使用Vue就必须引入这个文件。…

【微服务】Nacos

一、安装 1、官网地址&#xff1a;https://nacos.io/download/nacos-server/ 2、启动&#xff1a;找到bin目录下的startup.cmd双击启动&#xff0c;或者打开一个命令窗口输入&#xff1a; startup.cmd -m standalone双击启动后如下&#xff1a;可以访问控制台地址 访问后的…

【Docker项目实战】使用Docker部署Paint Board在线创意画板工具

【Docker项目实战】使用Docker部署Paint Board在线创意画板工具 一、 Paint Board介绍1.1 Paint Board简介1.2 主要功能1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版…

在oracle下载jdk显示400 Bad Request Request Header Or Cookie Too Large

下载JDK17&#xff0c;官网地址&#xff1a;【https://www.oracle.com/cn/java/technologies/downloads/#jdk17-windows】 问题&#xff1a; 出现 400 Bad Request: Request Header Or Cookie Too Large 错误&#xff0c;通常是由于浏览器存储的 Cookies 或请求头过大所导致的…

实现一个Vue自定义指令

在 Vue 中&#xff0c;自定义指令允许你为 DOM 元素添加特定的行为或功能。下面是一个实现 Vue 自定义指令的简单示例&#xff0c;展示了如何创建一个指令&#xff0c;使得元素在鼠标悬停时改变背景色。 1. 创建自定义指令 在 Vue 2.x 中&#xff0c;你可以在 Vue.directive …

开发需求总结19-vue 根据后端返回一年的数据,过滤出符合条件数据

需求描述&#xff1a; 定义时间分界点&#xff1a;每月26号8点&#xff0c;过了26号8点则过滤出data数组中符合条件数据下个月的数据&#xff0c;否则过滤出当月数据 1.假如现在是2024年11月14日&#xff0c;那么过滤出data数组中日期都是2024-11月的数据&#xff1b; 2.假如…