小白訓練日記——2025/4/22

實驗描述

將GobalM模塊加入到changerEx的stage2中。
下面展示一些內聯片段:

model = dict(backbone=dict(interaction_cfg=(None,dict(type='GlobalM', embed_dim=128,num_heads=32,axial_strategy='row'),dict(type='ChannelExchange', p=1/2),dict(type='ChannelExchange', p=1/2))),decode_head=dict(num_classes=2,sampler=dict(type='mmseg.OHEMPixelSampler', thresh=0.7, min_kept=100000)),# test_cfg=dict(mode='slide', crop_size=crop_size, stride=(crop_size[0]//2, crop_size[1]//2)),)

GlobalM的定義如下:

@ITERACTION_LAYERS.register_module()
class GlobalM(nn.Module):"""全局空間多頭交互自注意力模塊(Global-M)功能:挖掘高維空間光譜特征中的全局空間相關性參數說明:embed_dim: 嵌入維度(特征通道數)num_heads: 注意力頭數axial_strategy: 軸向分割策略('row'行分割/'column'列分割)"""def __init__(self, embed_dim, num_heads, axial_strategy):super().__init__()self.embed_dim = embed_dimself.num_heads = num_headsself.head_dim = embed_dim // num_headsself.axial_strategy = axial_strategy# 1. QKV投影層(使用1x1卷積實現)# 輸入:B×C×H×W → 輸出:B×3C×H×W(分別對應Q,K,V)self.qkv_proj = nn.Conv2d(embed_dim, embed_dim * 3, kernel_size=1)# 2. 多頭交互卷積(論文中的ω^{3×3}操作)# 用于融合不同注意力頭的特征self.mh_interaction = nn.Conv2d(embed_dim, embed_dim, kernel_size=3, padding=1)# 3. 前饋網絡(FFN)# 結構:1x1卷積擴展→GELU激活→1x1卷積壓縮self.ffn = nn.Sequential(nn.Conv2d(embed_dim, embed_dim * 4, kernel_size=1),nn.GELU(),nn.Conv2d(embed_dim * 4, embed_dim, kernel_size=1))# 4. 層歸一化self.norm1 = nn.LayerNorm(embed_dim)self.norm2 = nn.LayerNorm(embed_dim)# 注意力縮放因子self.scale = self.head_dim ** -0.5def forward(self, x1, x2):"""前向傳播過程輸入:x (B, C, H, W)輸出:增強后的特征圖 (B, C, H, W)修改為兼容 IA_ResNet 的雙輸入結構,并返回兩個輸出參數:x1: 主輸入特征 (B, C, H, W)x2: 次輸入 (本模塊未使用,僅為保持接口兼容)返回:(out, x2): 返回處理后的特征和原始 x2(保持雙輸出結構)"""B, C, H, W = x1.shaperesidual = x1  # 殘差連接# === 第一階段:多頭自注意力 ===# 1. 層歸一化x_norm = self.norm1(x1.permute(0, 2, 3, 1)).permute(0, 3, 1, 2)# 2. 生成Q,K,Vqkv = self.qkv_proj(x_norm)  # B×3C×H×Wq, k, v = qkv.chunk(3, dim=1)  # 各為B×C×H×W# 3. 全局軸向分割(GAS策略)if self.axial_strategy == 'row':# 行分割:將特征圖按行分成H個token,每個token尺寸為W×Cq = q.reshape(B, self.num_heads, self.head_dim, H, W).permute(0, 3, 1, 4, 2)  # B×H×Nh×W×Dhk = k.reshape(B, self.num_heads, self.head_dim, H, W).permute(0, 3, 1, 4, 2)v = v.reshape(B, self.num_heads, self.head_dim, H, W).permute(0, 3, 1, 4, 2)else:  # column# 列分割:將特征圖按列分成W個token,每個token尺寸為H×Cq = q.reshape(B, self.num_heads, self.head_dim, H, W).permute(0, 4, 1, 3, 2)  # B×W×Nh×H×Dhk = k.reshape(B, self.num_heads, self.head_dim, H, W).permute(0, 4, 1, 3, 2)v = v.reshape(B, self.num_heads, self.head_dim, H, W).permute(0, 4, 1, 3, 2)# 4. 計算注意力權重(QK^T/sqrt(d_k))attn = (q @ k.transpose(-2, -1)) * self.scale  # B×L×Nh×L×L (L=H/W)attn = attn.softmax(dim=-1)# 5. 注意力加權求和out = attn @ v  # B×L×Nh×L×Dh# 6. 恢復原始形狀if self.axial_strategy == 'row':out = out.permute(0, 2, 4, 1, 3)  # B×Nh×Dh×H×Welse:out = out.permute(0, 2, 4, 3, 1)  # B×Nh×Dh×H×Wout = out.reshape(B, C, H, W)# 7. 多頭交互(3x3卷積融合多頭特征)out = self.mh_interaction(out)out += residual  # 殘差連接# === 第二階段:前饋網絡 ===residual = outout = self.norm2(out.permute(0, 2, 3, 1)).permute(0, 3, 1, 2)out = self.ffn(out)out += residual# 返回 (out, x2),即使 x2 未被修改return out, x2 if x2 is not None else x1  # 如果 x2 是 None,返回 x1 作為占位

實驗結果

在s2looking上的訓練完成后,在驗證集(每8k次進行一次驗證)上的結果為:

2025/04/16 01:10:45 - mmengine - INFO - Iter(val) [ 50/500]    eta: 0:00:17  time: 0.0331  data_time: 0.0058  memory: 578  
2025/04/16 01:10:47 - mmengine - INFO - Iter(val) [100/500]    eta: 0:00:14  time: 0.0402  data_time: 0.0130  memory: 578  
2025/04/16 01:10:49 - mmengine - INFO - Iter(val) [150/500]    eta: 0:00:12  time: 0.0317  data_time: 0.0045  memory: 578  
2025/04/16 01:10:50 - mmengine - INFO - Iter(val) [200/500]    eta: 0:00:10  time: 0.0318  data_time: 0.0046  memory: 578  
2025/04/16 01:10:52 - mmengine - INFO - Iter(val) [250/500]    eta: 0:00:08  time: 0.0319  data_time: 0.0046  memory: 578  
2025/04/16 01:10:54 - mmengine - INFO - Iter(val) [300/500]    eta: 0:00:06  time: 0.0321  data_time: 0.0047  memory: 578  
2025/04/16 01:10:55 - mmengine - INFO - Iter(val) [350/500]    eta: 0:00:05  time: 0.0318  data_time: 0.0045  memory: 578  
2025/04/16 01:10:57 - mmengine - INFO - Iter(val) [400/500]    eta: 0:00:03  time: 0.0361  data_time: 0.0087  memory: 578  
2025/04/16 01:10:59 - mmengine - INFO - Iter(val) [450/500]    eta: 0:00:01  time: 0.0320  data_time: 0.0047  memory: 578  
2025/04/16 01:11:00 - mmengine - INFO - Iter(val) [500/500]    eta: 0:00:00  time: 0.0310  data_time: 0.0041  memory: 578  
2025/04/16 01:11:00 - mmengine - INFO - per class results:
2025/04/16 01:11:00 - mmengine - INFO - 
+-----------+--------+-----------+--------+-------+-------+
|   Class   | Fscore | Precision | Recall |  IoU  |  Acc  |
+-----------+--------+-----------+--------+-------+-------+
| unchanged | 98.96  |   99.07   | 98.85  | 97.94 | 98.85 |
|  changed  | 30.29  |    28.2   | 32.71  | 17.85 | 32.71 |
+-----------+--------+-----------+--------+-------+-------+
2025/04/16 01:11:00 - mmengine - INFO - Iter(val) [500/500]    aAcc: 97.9500  mFscore: 64.6200  mPrecision: 63.6300  mRecall: 65.7800  mIoU: 57.8900  mAcc: 65.7800  data_time: 0.0062  time: 0.0340

在測試集上的結果為:

2025/04/22 19:40:01 - mmengine - WARNING - The prefix is not set in metric class IoUMetric.
2025/04/22 19:40:01 - mmengine - INFO - Load checkpoint from changer_r18_globalM_stage2/iter_80000.pth
2025/04/22 19:40:17 - mmengine - INFO - Iter(test) [  50/1000]    eta: 0:04:56  time: 0.1928  data_time: 0.1650  memory: 17217  
2025/04/22 19:40:26 - mmengine - INFO - Iter(test) [ 100/1000]    eta: 0:03:40  time: 0.1764  data_time: 0.1476  memory: 479  
2025/04/22 19:40:35 - mmengine - INFO - Iter(test) [ 150/1000]    eta: 0:03:10  time: 0.1709  data_time: 0.1438  memory: 479  
2025/04/22 19:40:43 - mmengine - INFO - Iter(test) [ 200/1000]    eta: 0:02:46  time: 0.1655  data_time: 0.1373  memory: 479  
2025/04/22 19:40:51 - mmengine - INFO - Iter(test) [ 250/1000]    eta: 0:02:27  time: 0.1496  data_time: 0.1225  memory: 479  
2025/04/22 19:40:59 - mmengine - INFO - Iter(test) [ 300/1000]    eta: 0:02:14  time: 0.1564  data_time: 0.1296  memory: 479  
2025/04/22 19:41:07 - mmengine - INFO - Iter(test) [ 350/1000]    eta: 0:02:02  time: 0.1574  data_time: 0.1296  memory: 479  
2025/04/22 19:41:16 - mmengine - INFO - Iter(test) [ 400/1000]    eta: 0:01:51  time: 0.1477  data_time: 0.1202  memory: 479  
2025/04/22 19:41:24 - mmengine - INFO - Iter(test) [ 450/1000]    eta: 0:01:41  time: 0.1874  data_time: 0.1595  memory: 479  
2025/04/22 19:41:33 - mmengine - INFO - Iter(test) [ 500/1000]    eta: 0:01:32  time: 0.1641  data_time: 0.1348  memory: 479  
2025/04/22 19:41:41 - mmengine - INFO - Iter(test) [ 550/1000]    eta: 0:01:21  time: 0.1415  data_time: 0.1143  memory: 479  
2025/04/22 19:41:49 - mmengine - INFO - Iter(test) [ 600/1000]    eta: 0:01:12  time: 0.1890  data_time: 0.1607  memory: 479  
2025/04/22 19:41:58 - mmengine - INFO - Iter(test) [ 650/1000]    eta: 0:01:02  time: 0.1698  data_time: 0.1416  memory: 479  
2025/04/22 19:42:06 - mmengine - INFO - Iter(test) [ 700/1000]    eta: 0:00:53  time: 0.1320  data_time: 0.1043  memory: 479  
2025/04/22 19:42:13 - mmengine - INFO - Iter(test) [ 750/1000]    eta: 0:00:43  time: 0.1528  data_time: 0.1256  memory: 479  
2025/04/22 19:42:22 - mmengine - INFO - Iter(test) [ 800/1000]    eta: 0:00:35  time: 0.1697  data_time: 0.1419  memory: 479  
2025/04/22 19:42:31 - mmengine - INFO - Iter(test) [ 850/1000]    eta: 0:00:26  time: 0.1735  data_time: 0.1456  memory: 479  
2025/04/22 19:42:39 - mmengine - INFO - Iter(test) [ 900/1000]    eta: 0:00:17  time: 0.1672  data_time: 0.1386  memory: 479  
2025/04/22 19:42:49 - mmengine - INFO - Iter(test) [ 950/1000]    eta: 0:00:08  time: 0.1929  data_time: 0.1649  memory: 479  
2025/04/22 19:42:58 - mmengine - INFO - Iter(test) [1000/1000]    eta: 0:00:00  time: 0.1733  data_time: 0.1454  memory: 479  
2025/04/22 19:42:58 - mmengine - INFO - per class results:
2025/04/22 19:42:58 - mmengine - INFO - 
+-----------+--------+-----------+--------+-------+-------+
|   Class   | Fscore | Precision | Recall |  IoU  |  Acc  |
+-----------+--------+-----------+--------+-------+-------+
| unchanged | 99.39  |   98.79   | 100.0  | 98.79 | 100.0 |
|  changed  |  0.08  |   90.77   |  0.04  |  0.04 |  0.04 |
+-----------+--------+-----------+--------+-------+-------+
2025/04/22 19:42:58 - mmengine - INFO - Iter(test) [1000/1000]    aAcc: 98.7900  mFscore: 49.7400  mPrecision: 94.7800  mRecall: 50.0200  mIoU: 49.4100  mAcc: 50.0200  data_time: 0.1437  time: 0.1761

實驗結果分析

關鍵觀察:
1.類別間性能差異顯著:
驗證集:unchanged類Fscore=98.96 vs changed類Fscore=30.29
測試集:unchanged類Fscore=99.39 vs changed類Fscore=0.08
2.測試集性能崩塌:
changed類的Recall從驗證集32.71驟降到0.04,說明模型完全無法檢測變化區域
3.訓練-測試泛化差距:
驗證集mIoU=57.89 → 測試集mIoU=49.41,顯示過擬合風險

可能原因分析:

    1. 類別極端不平衡問題
      從驗證集結果推測數據分布中unchanged樣本占比極高(可能超過99%)
      模型學習到"always predict unchanged"的簡單策略即可獲得高整體準確率
      測試集changed類樣本可能更少或分布差異更大
    1. GlobalM模塊適配性問題
      軸向注意力(row/column分割)可能破壞局部空間關系,對變化檢測需要的精細定位不利
      32個注意力頭過多(通常建議head_dim≥32),可能導致注意力過于分散
      多頭交互的3x3卷積可能引入不必要的位置偏置
    1. 訓練策略缺陷
      OHEM設置不當(thresh=0.7過高),難例挖掘未能有效捕捉變化樣本
      沒有使用類別平衡損失函數(如Focal Loss)
      可能缺乏有效的數據增強(特別是對變化區域的增強)
    1. 特征交互設計問題
      Stage2中GlobalM與ChannelExchange交替使用可能導致特征混淆
      雙流結構的信息融合方式不夠合理(x2特征未被有效利用)

改進建議

1.數據層面:

  • 重平衡數據集:
    使用加權采樣(oversampling changed類)
    引入copy-paste augmentation人工增加變化區域

  • 增強策略:
    針對變化檢測設計空間變換增強(如非對稱形變)
    使用MixUp增強策略平衡類別

2. 模型層面:

  • 注意力機制改進:
# 修改GlobalM參數配置
dict(type='GlobalM', embed_dim=128,num_heads=8,  # 減少注意力頭數axial_strategy='hybrid',  # 增加行列交替策略use_local_attn=True)  # 新增局部注意力分支
  • 特征交互優化:
    在GlobalM后增加空間注意力門控機制
    將ChannelExchange替換為可學習的ChannelAttention
  • 解碼頭改進:
decode_head=dict(num_classes=2,loss_decode=dict(type='FocalLoss', loss_weight=[1.0, 5.0]),  # 類別加權sampler=dict(type='mmseg.OHEMPixelSampler', thresh=0.5, min_kept=150000)  # 調整閾值
)

3.訓練策略:

  • 漸進式訓練:
    第一階段凍結GlobalM,先訓練基礎特征提取器
    第二階段分層解凍注意力模塊
  • 損失函數改進:
    Dice Loss + Focal Loss組合
    引入邊界感知損失(Boundary-aware Loss)
  • 后處理優化:
test_cfg=dict(mode='slide',crop_size=(512, 512),stride=(256, 256),post_process=dict(type='CRFPostProcess',  # 增加條件隨機場后處理win_size=5,iter_max=10)
)

驗證方向:

  • 可視化分析:
    使用Grad-CAM可視化GlobalM的注意力區域
    對比有無GlobalM的特征響應圖
  • 消融實驗:
    逐步移除各組件驗證有效性
    測試不同注意力頭數的影響(8/16/32)
  • 數據診斷:
    統計測試集changed樣本數量
    檢查標注質量(可能存在標注噪聲)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77743.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77743.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77743.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【上位機——MFC】MFC入門

MFC庫中相關類簡介 CObject MFC類庫中絕大部分類的父類,提供了MFC類庫中一些基本的機制。 對運行時類信息的支持。對動態創建的支持。對序列化的支持。 CWinApp 應用程序類,封裝了應用程序、線程等信息。 CDocument 文檔類,管理數據 F…

代碼隨想錄第三十七天|華為秋季筆試真題230823

刷題小記: 主要偏向扎實編碼基礎的考察,但貌似近些年題目難度有所提高,僅供參考。 卡碼網136.獲取連通的相鄰節點列表(卡碼網136.獲取連通的相鄰節點列表) 題目分析: 題目描述: 存在N個轉發…

計算機視覺cv2入門之實時手勢檢測

前邊我們已經講解了使用cv2進行圖像預處理以及針對實時視頻流文件的操作方法,這里我們通過實時手勢檢測這一案例來學習和實操一下。 大致思路 根據手勢的種類以及指定手勢圖片數量來構建一個自己的手勢圖片數據集CNN模型訓練手勢圖片數據集使用訓練好的模型進行實時…

Java 安全:如何防止 SQL 注入與 XSS 攻擊?

Java 安全:如何防止 SQL 注入與 XSS 攻擊? 在 Java 開發領域,安全問題至關重要,而 SQL 注入和 XSS 攻擊是兩種常見的安全威脅。本文將深入探討如何有效防止這兩種攻擊,通過詳細代碼實例為您呈現解決方案。 一、SQL 注…

Itext進行PDF的編輯開發

這周寫了一周的需求,是制作一個PDF生成功能,其中用到了Itext來制作PDF的視覺效果。其中一些功能不是很懂,僅作記錄,若要學習請仔細甄別正確與否。 開始之前,我還是想說,這傻福需求怎么想出來的&#xff0c…

android編譯使用共享緩存

注意 服務器端與客戶端系統的版本號需為Ubuntu20.04ccache版本不能低于4.4執行用戶需要為sudo權限服務器端nfs目錄權限必須為nobody:nogroup 一、服務端配置: 在服務器192.168.60.142上配置 NFS 共享 1.安裝 NFS 服務器: 1 sudo apt-get install nfs…

工作中sql總結

sql總結 場景1分組后失敗的成功數據帶入場景2完全性質的一對一匹配場景3虛擬戶的特殊匹配場景4多對多匹配場景5一對一匹配場景6 一對多匹配 場景1分組后失敗的成功數據帶入 現有一批交易表的數據,根據戶名,日期,金額分組,存在TRA…

QML FontDialog:使用FontDialog實現字體選擇功能

目錄 引言相關閱讀FontDialog基本介紹字體屬性 實例演示項目結構代碼實現Main.qmlmain.cpp 代碼解析運行效果 總結 引言 在桌面應用程序開發中,字體選擇是一個常見的需求。Qt Quick提供了FontDialog組件來實現這一功能。本文將介紹如何在Qt Quick應用程序中使用Fon…

MCP(3):在CherryStudio中使用MCPServer

上一文章講述了如何新建一個MCP Server,并在MCP Inspector完成測試。本文講述如何在CherryStudio中進行測試。 Cherry Studio 是一款由 CherryHQ 開發的多模型支持的 AI 桌面助手,兼容 Windows、Linux 和 macOS 系統,旨在為用戶提供更便捷、…

面試題-鏈表(2)

1.合并兩個有序鏈表: 21. 合并兩個有序鏈表 - 力扣(LeetCode) public ListNode mergeTwoLists(ListNode headA, ListNode headB){ListNode newheadnew ListNode(-1);ListNode curnewhead;while(headA!null&&headB!null){if(headA.va…

微軟Entra新安全功能引發大規模賬戶鎖定事件

誤報觸發大規模鎖定 多家機構的Windows管理員報告稱,微軟Entra ID新推出的"MACE"(泄露憑證檢測應用)功能在部署過程中產生大量誤報,導致用戶賬戶被大規模鎖定。這些警報和鎖定始于昨夜,部分管理員認為屬于誤…

【MATLAB第117期】#源碼分享 | 基于MATLAB的SSM狀態空間模型多元時間序列預測方法(多輸入單輸出)

【MATLAB第117期】#源碼分享 | 基于MATLAB的SSM狀態空間模型多元時間序列預測方法(多輸入單輸出) 引言 本文使用狀態空間模型實現失業率遞歸預測,狀態空間模型(State Space Model, SSM)是一種用于描述動態系統行為的…

谷歌瀏覽器搜索后的頁面總是覆蓋當前頁面

最近將搜索引擎換為谷歌后,發現,每次搜索完的結果頁面總是覆蓋當前頁面,非常不方便,在瀏覽器設置中又找不到類似設置的選項,然后終于在一個博主“如何設置使谷歌瀏覽器打開鏈接自動跳轉到新標簽頁而不是覆蓋當前頁面?…

記錄學習的第三十天

今天終于又開始寫博客了。 還是滑動窗口問題,這段時間不出意外都是這了 上面的思路是我自己做的,但是不知道為什么不行,有沒有大佬能指點一下我。 接下來這道題是進階的。不過我之前的基礎都做的很艱難,道阻且長啊。

QTextDocument 入門

一、QTextDocument QTextDocument 是 Qt 中用于處理富文本文檔的核心類,支持文本格式、圖片、表格等復雜內容。 1. QTextDocument 入門 1.1 基本概念 QTextDocument 是 Qt 中用于處理富文本內容的核心類,它提供了: 結構化文本存儲&#x…

WebRTC服務器Coturn服務器相關測試工具

1、概述 在安裝開源的webrtc服務器coturn服務器后,會附帶安裝coturn的相關工具,主要有以下幾種工具 2、turnadmin工具 說明:服務器命令行工具,提供添加用戶、添加管理員、生成TURN密鑰等功能,turnadmin -h查看詳細用…

如何創建Vue3工程

1.首先下載環境 (默認下好了VS code) Node.js: Node.js 中文網 — 下載 Node.js 選擇要下載的版本 檢查環境: 在命令行中輸入 node ,檢查版本號 2.創建工程 1.找到自己要創建工程的文件目錄,右鍵打開打開終端 在終端輸入創…

基于大模型的肛裂手術全流程預測與治療方案研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目標與創新點 1.3 研究方法與技術路線 二、肛裂概述與大模型技術原理 2.1 肛裂的醫學定義與分類 2.2 肛裂的發病機制與臨床癥狀 2.3 大模型技術簡介 三、大模型在肛裂術前預測的應用 3.1 術前風險因素分析與數據收集 3.2 …

【趣味小游戲】--掃雷游戲

目錄 一.test.c部分 二.game.h部分 三.game.c部分 前言:前面學習了數組和函數等c語言相關知識,這篇文章我們將通過這些知識分為三個文件來完成掃雷游戲; 1.test.c //文件中寫游戲的測試邏輯 2.game.c //文件中寫游戲中函數的實現等 3.game.h. //文件中寫…

【微服務】SpringBoot制作Docker鏡像接入SkyWalking詳解

目錄 一、前言 二、SkyWalking介紹 2.1 SkyWalking是什么 2.2 SkyWalking核心功能 2.3 SkyWalking整體架構 2.4 SkyWalking主要工作流程 三、前置準備 3.1 搭建SkyWalking服務 3.1.1 下載安裝包 3.1.2 上傳服務器目錄 2.1.3 數據庫持久化配置說明 3.1.4 啟動skywalk…