【深度學習】重采樣(Resampling)

在深度學習的背景下,重采樣主要涉及兩個方面:

  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;正在從根本上重塑軟件測試的格…