在深度学习的背景下,重采样主要涉及两个方面:

  1. 数据层面的重采样:处理不平衡数据集。
  2. 模型层面的重采样:在神经网络内部进行上采样(UpSampling)或下采样(DownSampling),常见于架构如编码器-解码器(Encoder-Decoder)或生成对抗网络(GAN)。

1. 数据层面的重采样:处理类别不平衡

在许多现实世界的数据集中(如医疗诊断、欺诈检测),不同类别的样本数量可能差异巨大。例如,99%的样本是正常交易,只有1%是欺诈交易。如果直接用这样的数据训练模型,模型会倾向于预测多数类,导致对少数类的识别率极差。

解决方法就是通过重采样来调整训练集的分布。

A. 过采样(Oversampling)

增加少数类的样本数量,使其与多数类相当。

  • 随机过采样:随机复制少数类样本。

    • 优点:简单。
    • 缺点:容易导致过拟合,因为模型会多次看到完全相同的样本。
  • SMOTE(Synthetic Minority Over-sampling Technique)创建新的合成样本,而不是简单复制。

    • 原理:对每一个少数类样本,从其K个最近邻中随机选择一个样本,然后在这两个样本的连线上随机插值一点,作为新样本。
    • 优点:有效增加了样本多样性,缓解了过拟合问题。
    • 缺点:可能会在多数类样本密集的区域创造一些“模糊”的样本,增加类别间的重叠。
B. 欠采样(Undersampling)

减少多数类的样本数量,使其与少数类相当。

  • 随机欠采样:随机地从多数类中删除一些样本。
    • 优点:简单,减少训练时间。
    • 缺点:可能会丢失多数类中包含的重要信息,导致模型欠拟合。

通常,SMOTE(或其变体,如ADASYN)与随机欠采样结合使用被认为是效果更好的策略。

在代码中的实现(以imbalanced-learn库为例)
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
from imblearn.pipeline import Pipeline
from collections import Counter# 假设 X_train, y_train 是你的训练数据和标签
print(f'Original dataset shape {Counter(y_train)}')# 定义一个采样管道:先SMOTE过采样,再随机欠采样
over = SMOTE(sampling_strategy=0.5)  # 使少数类达到多数类的一半数量
under = RandomUnderSampler(sampling_strategy=0.5) # 使多数类降到少数类的两倍数量
steps = [('o', over), ('u', under)]
pipeline = Pipeline(steps=steps)# 应用重采样
X_resampled, y_resampled = pipeline.fit_resample(X_train, y_train)print(f'Resampled dataset shape {Counter(y_resampled)}')

现代替代方案:除了重采样,还可以使用加权损失函数(如class_weight in PyTorch’s CrossEntropyLoss or TensorFlow/Keras)。这种方法在计算损失时,给少数类的错误预测赋予更高的权重,从而让模型更关注少数类。这通常是更受欢迎的方法,因为它不改变数据分布,计算高效。


2. 模型层面的重采样:特征图的空间变换

在卷积神经网络(CNN)架构中,特别是用于分割(如U-Net)、检测(如SSD)或生成(如GAN)的模型中,网络需要在不同分辨率的特征图之间进行转换。这就用到了上采样和下采样操作。

A. 下采样(DownSampling)

目的:增大感受野,提取更抽象、更全局的特征,同时减少计算量

  • 池化层(Pooling Layers)

    • 最大池化(Max Pooling):取窗口内的最大值。能更好地保留纹理特征。
    • 平均池化(Average Pooling):取窗口内的平均值。能更好地保留整体数据的特征。
    • 目前,最大池化更为常用
  • 带步长的卷积(Strided Convolution)

    • 使用stride > 1的卷积层,在计算卷积的同时直接实现下采样。
    • 例如,一个3x3卷积核,stride=2,输出特征图的高和宽会减半。
    • 这是现代架构(如ResNet)的首选,因为卷积层可以学习到最优的下采样方式,而池化层是确定性的、不可学习的。
B. 上采样(UpSampling)

目的:恢复空间分辨率,将压缩的、抽象的特征图映射回高分辨率的空间,用于像素级预测(如图像分割)或生成图像。

  • 转置卷积(Transposed Convolution / Deconvolution)

    • 虽然不是真正的反卷积,但它是可学习的上采样方法
    • 它通过插入零值或进行插值来扩展输入特征图的大小,然后进行常规卷积操作。
    • 缺点:如果核大小和步长参数设置不当,容易产生“棋盘效应”(checkerboard artifacts)。
  • 上采样 + 卷积(Upsampling + Convolution)

    • 先使用最近邻插值(Nearest Neighbor)双线性插值(Bilinear) 等不可学习的插值方法将特征图尺寸放大。
    • 然后跟一个普通的1x13x3卷积来平滑和细化特征。
    • 这种方法可以有效避免棋盘效应,是许多现代架构(如SRGAN)的选择。
  • Unpooling

    • 通常与Max Pooling配对使用。记录下Max Pooling时最大值的位置,在Unpooling时,将值放回原位置,其他位置填0。
    • 在U-Net等网络中有所应用,但不如前两种方法普遍。
在代码中的实现(以PyTorch为例)
import torch
import torch.nn as nn# 下采样
downsample_by_pool = nn.MaxPool2d(kernel_size=2, stride=2) # 使用池化
downsample_by_conv = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=2, padding=1) # 使用步长卷积# 上采样
upsample_by_transpose = nn.ConvTranspose2d(in_channels=64, out_channels=32, kernel_size=2, stride=2) # 转置卷积
upsample_by_interpolation = nn.Sequential(nn.Upsample(scale_factor=2, mode='nearest'),  # 或 'bilinear'nn.Conv2d(in_channels=64, out_channels=32, kernel_size=3, padding=1)
)

总结

方面类型方法目的关键点
数据重采样过采样随机过采样、SMOTE平衡类别分布,解决不平衡问题SMOTE创建合成样本,优于随机复制
欠采样随机欠采样平衡类别分布,解决不平衡问题可能丢失信息,常与过采样结合使用
模型重采样下采样池化层、步长卷积扩大感受野,减少计算量步长卷积是现代首选
上采样转置卷积、插值+卷积恢复空间分辨率,用于密集预测插值+卷积可避免棋盘效应

选择哪种重采样技术完全取决于你的具体任务:

  • 如果你的数据标签不平衡,优先考虑加权损失函数,如果效果不佳再尝试SMOTE结合欠采样
  • 如果你在设计网络结构(如图像分割),步长卷积用于下采样,最近邻/双线性上采样 + 卷积是稳健且高效的上采样选择。

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

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

相关文章

计算机实现乘法运算的方式---ChatGPT 5 thinking作答

计算机如何实现“乘法” 下面分层次把乘法在数据表示 → 整数硬件/软件 → 大整数 → 浮点数 → 特殊场景里的主流实现方式讲清楚,并给出取舍建议与简单伪代码。0)前置:数的表示 无符号整数:按二进制位权求值。有符号整数&#xf…

Ubuntu 安装 / 配置 VNC

一、基础环境准备 1. 更新 sudo apt update 2. 安装 VNC 服务器 & 轻量桌面(XFCE) # 安装 TightVNC 服务器 + XFCE 桌面(推荐轻量方案) sudo apt install tightvncserver xfce4 xfce4-goodies xterm -y二、核心配置:让 VNC 加载桌面环境 1. 初始化 VNC 密码(首次…

计算机大数据毕业设计推荐:基于Spark的新能源汽车保有量可视化分析系统

精彩专栏推荐订阅:在下方主页👇🏻👇🏻👇🏻👇🏻 💖🔥作者主页:计算机毕设木哥🔥 💖 文章目录 一、项目介绍二、…

Android Looper源码阅读

看下Android Looper源代码,有助于理解Android系统消息循环流程、handler机制。Looper注释为class used to run a message loop for a thread, 即用于为一个线程运行消息循环, 或者说循环处理一个线程的消息。 Looper源码先看下这个类里的变量…

uni-app 和 uni-app x 的区别

差异解析 uni-app 是 DCloud 推出的成熟跨平台前端框架,基于 Vue.js JavaScript/TypeScript。支持广泛平台:iOS、Android、HarmonyOS、Web、小程序等,用一套代码同时生成多个端应用。渲染方式主要通过 WebView 或小程序原生框架 JS 逻辑&am…

数据结构:深度优先搜索 (Depth-First Search, DFS)

目录 DFS的诞生——“不撞南墙不回头” DFS的核心机制——如何实现“回溯”? DFS算法流程图解(递归版) C/C代码实现 DFS的应用 上一节我们学习了广度优先搜索 (BFS),它像水面的波纹一样,一层一层地向外探索。今天…

Spring Boot中策略模式结合依赖注入的实现方式

在Spring Boot项目开发中,常常会遇到根据不同的业务场景执行不同逻辑的需求,策略模式就是一种很好的设计模式来应对这种情况。同时,Spring Boot强大的依赖注入机制可以方便地将不同的策略类进行管理和调用。 1. 定义策略接口 定义一个策略接口…

深入剖析Spring Boot中Spring MVC的请求处理流程

对于任何使用Spring Boot进行Web开发的开发者而言,深入理解Spring MVC的执行流程都是至关重要的。这不仅有助于我们编写更清晰、更高效的代码,更是我们排查诡异问题、进行高级定制开发的知识基石。今天,我们将一起深入Spring Boot应用的内核&…

X448 算法签名验签流程深度解析及代码示例

一、引言:X448 算法的定位与价值在椭圆曲线密码学(ECC)体系中,X448 是基于蒙哥马利曲线(Curve448)的密钥交换算法,但其底层数学原理也可支撑签名验签功能(实际工程中常与 Ed448 签名…

2025-2026单片机物联网毕业设计题目推荐(定稿付款)

51.基于单片机的非接触式防疫自动门系(1)人员检测:利用超声波模块进行人员检测,检测到人员靠近门体时触发相应的操作;(2)门控制:通过舵机实现自动门的开闭控制,当检测到有…

一文详解大模型强化学习(RLHF)算法:PPO、DPO、GRPO、ORPO、KTO、GSPO

一、 引言 大模型强化学习的核心目标是让模型的输出与人类目标、真实场景需求对齐。在工作和学习中,大模型强化学习训练经常会遇到各种算法,各种O,在强化学习训练选型过程中经常容易混淆,也分不清各种训练算法的使用场景和优缺点。…

C++ 常见面试题汇总

基础知识 一、C 基础语法C 和 C 的区别? C 支持面向对象(封装、继承、多态)。C 引入模板、STL、异常处理。值传递、指针传递、引用传递的区别? 值传递:拷贝一份副本。指针传递:传地址,可修改原数…

ES06-SpringData集成

ES06-SpringData集成 文章目录ES06-SpringData集成1-参考网址2-知识整理3-Spring Data Elasticsearch 9.0.0 完整示例4-知识补充1-Elasticsearch JAVA操作有三种客户端:1. TransportClient(已废弃)2. JestClient(第三方 HTTP 客户端&#xff…

对于链表相关经典算法题:环形链表的约瑟夫问题的解析

开篇介绍: Hello 大家,在上一篇博客中,我们一同拆解了「206. 反转链表」和「876. 链表的中间结点」这两道单链表经典题目,通过对指针操作的细致打磨,相信大家对单链表的特性与算法设计思路有了更深入的理解。而在今天…

MySQL集群——主从复制

目录 一、环境搭建、部署 1. RHEL7.9、9.3的搭建 二、主从复制 1. 环境说明 2. 环境准备 1)克隆RHEL79_mysql_master 2)改名为 “RHEL79_mysql_slave” 并修改IP 3)修改主机名 3. 部署MySQL主从同步 1)主库(mysql-master) 2&…

《用 asyncio 构建异步任务队列:Python 并发编程的实战与思考》

《用 asyncio 构建异步任务队列:Python 并发编程的实战与思考》 一、引言:并发编程的新时代 在现代软件开发中,性能已不再是锦上添花,而是产品成功的基石。尤其在 I/O 密集型场景中,如网络爬虫、实时数据处理、微服务通信等,传统的同步编程模式往往力不从心。 Python …

【Linux】yum工具篇

目录一、软件包管理器1.1 什么是软件包1.2 Linux软件生态二、yum具体操作2.1 查找软件包2.2 安装软件包2.3 卸载软件配置文件所在路径个人主页<—请点击 Linux专栏<—请点击 一、软件包管理器 1.1 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码…

撬动制造全场景增效,开利空调找到了怎样的“通关密码”?

由深圳软件协会指导、法大大和信息侠联合出品的《制造行业合同数智化升级白皮书》&#xff08;以下简称“白皮书”&#xff09;首次提出了 “电子签法律AI” 双轮驱动模型。在制造行业面临供应链协同、合规风控及全球化出海等多重挑战的当下&#xff0c;法大大依托丰富的制造企…

[Android]RecycleView的item用法

RecyclerView 是 Android 提供的一个强大的列表控件&#xff0c;用来显示大量数据。RecyclerView 的主要特点 1. 高性能的视图复用机制 Recycle就是循环的意思&#xff0c;那么recycleview的特点也很鲜明了&#xff0c;它只会创建出在屏幕内和一定缓存的itemview,当view滑出屏幕…

AI驱动的软件测试:革命性的自动化、缺陷检测与实验优化

引言在当今快节奏的软件开发生命周期&#xff08;SDLC&#xff09;中&#xff0c;传统测试方法已逐渐无法满足对速度、覆盖面和准确性的极高要求。人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术的融入&#xff0c;正在从根本上重塑软件测试的格…