✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)基于特征表征不确定性的轻量级主动学习策略:
针对深度学习模型训练需要大量标注样本的痛点,提出了一种利用特征不确定性进行样本筛选的主动学习方法。该方法的核心是构建一个轻量级的不确定表示模型,该模型由特征提取器和不确定性量化器两部分组成。特征提取器采用深度可分离卷积以减少参数量,从输入图像或信号中提取深层语义特征。不确定性量化器则通过一个正则化概率矩阵生成器,将特征向量映射为多维高斯分布的均值和方差,从而以概率分布的形式表征每个样本的不确定性。在主动学习迭代过程中,首先用少量标注数据训练基础模型,然后对未标注池中所有样本进行前向推理,计算每个样本的特征不确定性得分(例如方差迹或熵值)。最后基于知识蒸馏思想,选择不确定性得分最高且样本多样性较好的批次交由专家标注。实验证明,该策略仅使用20%的标注数据就能达到全数据训练95%以上的分类准确率,显著降低了标注成本。
(2)外部子网络约束权重的特征学习策略:
为了解决传统卷积网络在特征提取时对核心区域关注不足和低级细节丢失的问题,提出了一种新颖的外部子网络约束机制。该机制在卷积单元外部嵌入一个轻量级的辅助网络,该网络通过自适应局部感知模块对输入特征图进行通道修正。具体而言,辅助网络首先对特征图进行全局平均池化和全局标准差池化,得到通道统计向量;然后经过两个全连接层生成通道缩放系数和偏置系数,对原始特征图的每个通道进行线性变换。这一过程可以看作是对主网络权重的一种软约束,引导主网络更加关注与任务相关的特征通道。同时,在浅层卷积块之间引入伪记忆机制,以短期权重的形式存储低级细节特征(如边缘、纹理)的激活模式,并在反向传播时通过正则化项使这些模式得以保持。两个机制的协同作用使得网络在加深的同时不会遗忘浅层的判别信息,实验表明该方法在CIFAR-10和故障诊断数据集上分别提升了3.2%和4.7%的准确率。
(3)双路径与单路径特征融合网络模型:
针对特征融合不全面和类间映射动态性不足的问题,分别设计了双路径特征融合网络和高维动态映射分类块。双路径网络包含残余卷积和动态预激活卷积两条支路:残余卷积支路通过恒等映射保证梯度流畅;动态预激活卷积支路根据输入特征动态调整卷积核权重,增强特征多样性。两条支路的输出通过通道注意力模块进行加权融合,实现了多层次特征的抽象表达。另一方面,单路径融合网络模型则提出了自主分离卷积和高维动态映射分类块。自主分离卷积将标准卷积分解为通道分组卷积和点卷积,并引入可学习的分组数,使得网络能够根据数据特征自适应调整分组密度。高维动态映射分类块则将最后一个特征图映射到高维核空间,然后通过一个小型全连接网络动态预测每个类别的权重向量,替代传统的固定权重分类层。该方法在处理细粒度分类和跨域任务时,能够显著提升对微小特征差异的辨识能力。"
import torch import torch.nn as nn import torch.nn.functional as F # 轻量级不确定表示模型 class LightweightUncertaintyModel(nn.Module): def __init__(self, input_channels=1, feature_dim=128): super().__init__() self.feature_extractor = nn.Sequential( nn.Conv1d(input_channels, 16, kernel_size=3, padding=1), nn.BatchNorm1d(16), nn.ReLU(), nn.Conv1d(16, 32, kernel_size=3, padding=1), nn.BatchNorm1d(32), nn.ReLU(), nn.AdaptiveAvgPool1d(32), nn.Flatten(), nn.Linear(32*32, feature_dim) ) # 不确定性量化器:预测均值和方差的对数 self.fc_mu = nn.Linear(feature_dim, feature_dim) self.fc_logvar = nn.Linear(feature_dim, feature_dim) self.dropout = nn.Dropout(0.2) def forward(self, x): feat = self.feature_extractor(x) mu = self.fc_mu(feat) logvar = self.fc_logvar(feat) return mu, logvar def uncertainty_score(self, x, mc_samples=10): mu_list, logvar_list = [], [] for _ in range(mc_samples): mu, logvar = self.forward(x) mu_list.append(mu); logvar_list.append(logvar) mu_avg = torch.stack(mu_list).mean(0) var_avg = torch.exp(torch.stack(logvar_list).mean(0)) # 不确定性得分 = 方差迹 + 负对数似然 (简化) score = var_avg.sum(dim=1).mean() + 0.5 * (((mu_avg - mu_avg.mean(0))**2).sum(dim=1)).mean() return score # 外部子网络约束模块 class ExternalSubnetConstraint(nn.Module): def __init__(self, channels): super().__init__() self.gap = nn.AdaptiveAvgPool1d(1) self.gsp = lambda x: torch.sqrt(torch.var(x, dim=[2], unbiased=False) + 1e-5) self.fc = nn.Sequential( nn.Linear(channels*2, channels//8), nn.ReLU(), nn.Linear(channels//8, channels*2), nn.Sigmoid() ) def forward(self, x): n,c,l = x.shape stats = torch.cat([self.gap(x).view(n,c), self.gsp(x).view(n,c)], dim=1) gamma_beta = self.fc(stats) # gamma and beta gamma = gamma_beta[:, :c].view(n,c,1) beta = gamma_beta[:, c:].view(n,c,1) return x * gamma + beta # 自主分离卷积 class AutonomousSeparableConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=3): super().__init__() self.groups_predictor = nn.Linear(in_channels, 1) # 动态决定分组数 self.depthwise = nn.Conv1d(in_channels, in_channels, kernel_size, groups=in_channels, padding=1) self.pointwise = nn.Conv1d(in_channels, out_channels, 1) def forward(self, x): # 根据输入通道自适应分组(此处简化,实际groups需要整数) groups = max(1, int(self.groups_predictor(x.mean(dim=[2])).mean().item())) self.depthwise.groups = groups * (x.size(1)//groups) if x.size(1) % groups ==0 else 1 x = self.depthwise(x) x = self.pointwise(x) return x # 高维动态映射分类块 class DynamicMappingClassifier(nn.Module): def __init__(self, in_features, num_classes, hidden_dim=256): super().__init__() self.kernel_net = nn.Sequential( nn.Linear(in_features, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, num_classes * in_features) ) self.num_classes = num_classes self.in_features = in_features def forward(self, x): # x: (batch, in_features) batch = x.size(0) weights = self.kernel_net(x.mean(0, keepdim=True)) # (1, num_classes * in_features) weights = weights.view(self.num_classes, self.in_features) # (num_classes, in_features) logits = torch.mm(x, weights.t()) # (batch, num_classes) return logits # 双路径融合网络简例 class DualPathFusion(nn.Module): def __init__(self, in_chan, out_chan): super().__init__() self.conv_res = nn.Conv1d(in_chan, out_chan, kernel_size=3, padding=1) self.conv_dyn = nn.Conv1d(in_chan, out_chan, kernel_size=3, padding=1) self.attention = nn.Sequential(nn.AdaptiveAvgPool1d(1), nn.Conv1d(out_chan*2, out_chan,1), nn.Sigmoid()) def forward(self, x): res = self.conv_res(x) dyn = self.conv_dyn(x) combined = torch.cat([res, dyn], dim=1) weight = self.attention(combined) return res * weight + dyn * (1-weight) "如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇