博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。


(1)基于纹理损失的多尺度特征对齐迁移学习方法

滚动轴承在不同工况下采集到的振动信号往往呈现出显著的分布偏差,源域工况充足的故障标签数据所训练出来的模型直接应用于目标域时性能急剧下降,如何有效利用源域知识辅助目标域诊断成为深度迁移学习领域的重要课题。本研究受到计算机视觉中风格迁移技术的启发,提出了一种基于纹理损失的多尺度特征分布对齐方法。算法的核心创新在于将振动信号中各种频带的特征模式视为一种"纹理",通过Gram矩阵这一数学工具来捕获不同尺度上特征通道之间的协方差结构,从而刻画信号的纹理统计特性。具体实现上,我们对源域与目标域的信号同时通过深度卷积特征提取器获得多个层级的特征图,然后在每一层级上分别计算对应特征图的Gram矩阵,该Gram矩阵的元素值反映了任意两个特征通道之间的相关性,本质上描述了信号特征的纹理统计指纹。源域与目标域的Gram矩阵之间的Frobenius范数距离即被定义为纹理损失,通过最小化纹理损失,模型在多个特征层级上同时拉近了两域之间的纹理分布,有效提升了模型对源域目标域之间多尺度差异的适应能力。

(2)核范数正则化约束下的特征结构保持机制

单纯依靠分布对齐损失进行迁移学习存在着一个潜在的隐患:在过度强调两域特征分布对齐的过程中,模型可能将类别判别能力较强的源域特征结构破坏,导致迁移后的模型虽然在域间分布上达到了对齐却失去了应有的分类性能。为避免这种"过度对齐"现象的发生,本研究在纹理损失的基础上额外引入了基于核范数正则化的特征结构保持机制。核范数即矩阵的奇异值之和,在矩阵分析中常用于衡量矩阵的低秩结构,大的核范数对应于矩阵中主要奇异值能量较为集中的低秩特征,这与具有清晰类别判别边界的特征矩阵特性相吻合。我们将目标域特征矩阵的核范数作为正则化项加入到优化目标当中,通过最大化核范数引导模型保持特征矩阵的低秩判别结构,在实现域间分布对齐的同时维持了类别可分性。从优化求解角度看,核范数正则化项可通过迹范数与奇异值阈值算子的组合进行高效计算,不会显著增加整体训练的计算开销。两类机制协同工作使得迁移模型在域适应能力与判别能力之间取得了良好平衡。

(3)面向多源域知识聚合的层次化迁移框架

工业现场的轴承数据通常分布在多个不同的工况域当中,每个工况域的数据特性与故障表现都存在着差异,如何高效地从多个源域中聚合知识并迁移到目标域是迁移学习应用中的实际难题。本研究构建了一个层次化的多源域知识迁移框架,从域间相似度度量、源域权重分配以及多源知识聚合三个层面系统解决该问题。在域间相似度度量层面,算法基于前述的纹理损失为每一个源域与目标域之间计算一个相似性分数,分数高低反映了对应源域对目标域迁移的潜在贡献程度;在源域权重分配层面,我们将相似性分数通过softmax归一化得到一组源域权重,权重值动态调节各源域在最终迁移过程中的影响力;在多源知识聚合层面,设计了一种共享主干加多专家分支的网络结构,每个源域对应一个专家分支负责学习该域特有的判别知识,所有分支共享底层特征提取主干,前述的源域权重则用于在推理阶段聚合多个专家分支的预测结果。该层次化框架通过分而治之的方式有效处理了源域异构性问题,在多源工况轴承数据集上的实验显示其相比单源迁移以及简单多源平均策略在目标域诊断精度上均有显著提升。

import torch
import torch.nn as nn
import torch.nn.functional as F

# 1. Gram矩阵:捕获特征通道间的"纹理"协方差
def gram_matrix(feat):
    # feat: (B, C, T)
    B, C, T = feat.shape
    f = feat.reshape(B, C, T)
    g = torch.bmm(f, f.transpose(1, 2)) / (C * T)
    return g

# 2. 纹理损失:源域目标域多尺度Gram矩阵对齐
def texture_loss(src_feats, tgt_feats):
    loss = 0
    for fs, ft in zip(src_feats, tgt_feats):
        loss += F.mse_loss(gram_matrix(fs), gram_matrix(ft))
    return loss / len(src_feats)

# 3. 核范数正则:保持目标域特征低秩判别结构
def nuclear_norm_reg(feat_matrix):
    # feat_matrix: (B, D)
    return torch.linalg.matrix_norm(feat_matrix, ord='nuc')

# 4. 多尺度特征提取主干(返回多层特征用于纹理损失)
class MultiLayerExtractor(nn.Module):
    def __init__(self):
        super().__init__()
        self.l1 = nn.Sequential(nn.Conv1d(1, 16, 7, stride=2), nn.ReLU())
        self.l2 = nn.Sequential(nn.Conv1d(16, 32, 5, stride=2), nn.ReLU())
        self.l3 = nn.Sequential(nn.Conv1d(32, 64, 3, stride=2), nn.ReLU())
        self.pool = nn.AdaptiveAvgPool1d(1)

    def forward(self, x):
        f1 = self.l1(x); f2 = self.l2(f1); f3 = self.l3(f2)
        feat = self.pool(f3).flatten(1)
        return feat, [f1, f2, f3]                      # 顶层特征 + 多层中间特征

# 5. 多源域专家融合网络
class MultiSourceTransferNet(nn.Module):
    def __init__(self, n_source=3, n_class=10):
        super().__init__()
        self.backbone = MultiLayerExtractor()
        # 每个源域对应一个专家分支
        self.experts = nn.ModuleList([
            nn.Linear(64, n_class) for _ in range(n_source)
        ])
        self.n_source = n_source

    def forward(self, x, source_weights):
        feat, multi_feats = self.backbone(x)
        # 多专家加权聚合
        logits = torch.stack([e(feat) for e in self.experts], dim=1)  # (B, n_src, C)
        out = (logits * source_weights.view(1, -1, 1)).sum(dim=1)
        return out, feat, multi_feats

# 6. 综合迁移损失
def transfer_total_loss(model, x_src, y_src, x_tgt, source_w):
    out_s, feat_s, mf_s = model(x_src, source_w)
    out_t, feat_t, mf_t = model(x_tgt, source_w)
    cls_loss = F.cross_entropy(out_s, y_src)           # 源域分类
    tex_loss = texture_loss(mf_s, mf_t)                # 纹理对齐
    # 注意:核范数最大化 → 取负号
    nuc_reg = -0.01 * nuclear_norm_reg(feat_t) / feat_t.shape[0]
    return cls_loss + 0.5 * tex_loss + nuc_reg


如有问题,可以直接沟通

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐