如何通过深度学习将正弦信号去噪的损失值降至1以内
正弦信号同频噪声去噪优化方案
问题背景
我有一系列含同频噪声的正弦信号,目标是通过深度学习实现去噪,将MSE Loss降至1以内(输入与目标信号数值范围为-100至100)。目前已尝试U-Net++、RIDNet、CBDNet、DnCNN等模型,输入为尺寸32*1*900、数值范围-100至100的正弦信号序列,输出尺寸及数值范围与输入一致,损失函数采用Huber Loss。但训练时损失值降至1.3后便不再下降,网络已出现饱和现象,同时期望预测与目标的差值尽可能接近高斯分布,求进一步降低损失值的方法。
当前使用的DnCNN模型代码
class DnCNN(nn.Module): def __init__(self, channels, num_of_layers=6): super(DnCNN, self).__init__() kernel_size = 3 padding = 1 features = 128 layers = [] layers.append(nn.Conv1d(in_channels=channels, out_channels=features, kernel_size=kernel_size, padding=padding)) layers.append(nn.GELU()) for _ in range(num_of_layers-2): layers.append(nn.Conv1d(in_channels=features, out_channels=features, kernel_size=kernel_size, padding=padding)) layers.append(nn.BatchNorm1d(features)) layers.append(nn.GELU()) layers.append(nn.Conv1d(in_channels=features, out_channels=channels, kernel_size=kernel_size, padding=padding)) layers.append(nn.Conv1d(in_channels=channels, out_channels=channels, kernel_size=kernel_size, padding=padding)) self.dncnn = nn.Sequential(*layers) def forward(self, x): f1 = self.dncnn(x) return f1
一、针对同频噪声的模型结构优化
- 引入频域分支或先验:同频噪声在频域有明显峰值,可把输入信号转成FFT频域特征,和时域特征拼接后喂给网络;或者单独做个频域子网络学噪声频谱模式,逆变换回时域后和时域分支输出融合,精准压制同频噪声。
- 调整DnCNN结构:
- 改成残差连接:把forward里的返回改成
return x + self.dncnn(x),残差能缓解梯度消失,提升学习能力,当前最后两层输出通道和输入一致,直接改就行; - 扩容网络:把层数加到10-12层,特征数提到256,当前6层128特征可能容量不够;
- 换归一化层:去掉BatchNorm1d,换成LayerNorm/InstanceNorm,或者直接删掉——BatchNorm可能破坏时序信号的局部相关性。
- 改成残差连接:把forward里的返回改成
二、损失函数与训练策略调整
- 组合损失函数:
- 保留Huber Loss的同时加频域损失:计算预测和目标信号FFT后的L2损失,强制网络在频域对齐,针对性压制同频噪声;
- 加KL散度损失:假设预测误差服从高斯分布,计算实际误差分布和预设高斯分布的KL散度,引导误差分布向高斯靠拢。
- 优化训练流程:
- 学习率衰减:用
ReduceLROnPlateau调度器,监测验证集损失,停滞5-10轮就把学习率砍到1/10; - 加正则化:在Conv1d后加
nn.Dropout(p=0.1),或者设置weight_decay=1e-4,防止过拟合导致损失卡住; - 数据增强:给输入信号做微小时域平移、±5%以内的幅度缩放,增加数据多样性,提升泛化能力。
- 学习率衰减:用
三、数据预处理与后处理
- 预处理优化:
- 归一化:把信号缩到[-1,1]范围,训练完再反归一化,提升收敛稳定性;
- 残差学习:把训练目标改成
噪声=输入-干净信号,让网络直接学噪声模式,比直接预测干净信号效率更高。
- 后处理优化:
- 平滑输出:用3-5窗口的滑动均值滤波,压掉残留的高频同频噪声,降低MSE;
- 修正误差偏置:统计预测和目标的差值分布,如果有整体偏置,给网络输出加个可学习的偏置项修正。
四、其他尝试方向
- 换时序专用模型:试试TCN(时序卷积网络)、Transformer类模型(比如TST、TimeNet),这类模型对时序长程相关性捕捉更强,适合处理周期性同频噪声;
- 调小batch size:降到16或8,配合梯度累积,让梯度更新更精准;
- 换激活函数:把GELU换成ReLU或LeakyReLU,部分场景下LeakyReLU的梯度流动更稳定,避免激活饱和。
内容的提问来源于stack exchange,提问作者Roy Mills
相关产品推荐
相关产品推荐

