信号去噪:使用专门设计的神经网络(NN)模型对测量信号进行去噪处理,使信号变得更平滑

信号预处理

为了对测量数据进行预处理,构建了一个全连接的前馈 NN 模型以将系统输入(即x 和 t)映射到其输出 u。

图显示了用于去噪的 NN 模型的结构。

它在输入层和输出层之间有五个隐藏层,神经元的数量分别为 50、100、500、100 和 50。该模型使用双曲正切激活函数(即 Tanh 函数)。建立均方误差 (MSE) 损失函数来评估测量和模型输出之间的差异。 Adam 优化器用于训练该模型,学习率设置为 0.001。 epochs 的数量设置为 20000。此外,在 NN 模型训练中采用了提前停止策略,以避免过度拟合。为此,将整个数据集分成训练集和验证集,训练与验证的比率为 80% 到 20%。在早期停止策略中,如果验证损失在 500 个 epoch 内没有连续减少(即耐心 = 500),模型训练将停止。将数据拆分为训练集和验证集并采用早期停止策略可防止 NN 过度拟合噪声分量并损害(而不是改善)信号质量。该预处理期望得到一系列平滑的信号。

Burgers 方程为例

Burgers 方程用于描述耗散系统的动力学。

表达式

初始条件,边界条件

 流体粒子的局部加速度,平流加速度,扩散项,

扩散系数(扩散系数要小得多,因此更难以正确识别。)

为了证明 NN 去噪的效果

        在 Burgers 方程的数值解中添加了 10% 的高斯白噪声,这显着改变了解的值(如图 4(b) 所示),因此对下一步计算数值导数提出了挑战。

        (噪声量化)在这项研究中,噪声水平是通过测量变量的标准偏差的百分比来量化的。例如,如果 10% 的噪声被添加到 u,那么结果是 un = u + 10% ∗ std(u) ∗ randn(size(u)) 其中 std(⋅) 计算标准差,randn(⋅)指定维度的高斯白噪声,size(·) 测量维度。

        在没有太多关于噪声特性的先验知识的情况下,应用 NN 建模对噪声测量值进行去噪,处理后的数据在图 4(c)中可视化。比较图 4 中的三个图,可以观察到 NN 去噪在很大程度上降低了收集数据中的噪声水平(从 10% 到 2%),并使解曲线比噪声测量更平滑。此外,将图 4(c) 与图 4(a) 进行比较,可以观察到,在没有过多牺牲有价值的信号分量的情况下实现了噪声抑制。

因此,NN去噪具有提高后续数值微分精度的潜力

 

为了进一步降低稀疏回归中噪声的影响,应用 FFT 将  和 分别转换为频域对应的。在 FFT 之后,实施频率截止以仅保留预期不易受噪声影响的低频分量。

 图 5 (a) 到 (d) 比较了时空域和频域中的相对误差。图 5 (a) 和 (b) 显示了 50% 噪声污染数据与模拟清洁数据之间的差异。可以观察到,在进行 2D FFT 后,低频分量受添加噪声的影响较小。

 分别是使用干净数据、噪声数据和 NN 去噪数据计算的二阶导数

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是PyTorch实现扩散概率模型对振动故障信号进行数据增广的代码示例: ``` python import torch import torch.nn as nn import numpy as np class DiffusionProbModel(nn.Module): def __init__(self, num_features, num_layers, hidden_size): super(DiffusionProbModel, self).__init__() self.num_features = num_features self.num_layers = num_layers self.hidden_size = hidden_size self.fc1 = nn.Linear(num_features, hidden_size) self.relu = nn.ReLU() self.fc_layers = nn.ModuleList([nn.Linear(hidden_size, hidden_size) for i in range(num_layers - 1)]) self.fc_out = nn.Linear(hidden_size, num_features) def forward(self, x): out = self.fc1(x) out = self.relu(out) for i in range(self.num_layers - 1): out = self.fc_layers[i](out) out = self.relu(out) out = self.fc_out(out) return out def data_augmentation(data, diffusion_prob_model, sigma): with torch.no_grad(): augmented_data = data.clone() for i in range(data.size(0)): noise = torch.randn(data.size(1), data.size(2)) * sigma noise = noise.to(device) for j in range(data.size(1)): x = augmented_data[i, j, :].clone() x = x.to(device) for k in range(data.size(2)): diff_prob = diffusion_prob_model(x) diff_prob = diff_prob.squeeze() diff_prob = diff_prob.cpu().numpy() diff_prob = np.exp(diff_prob) diff_prob /= np.sum(diff_prob) idx = np.random.choice(data.size(2), p=diff_prob) x[k] = x[idx] + noise[j, k] augmented_data[i, j, :] = x.cpu() return augmented_data ``` 上述代码中,我们定义了一个扩散概率模型类 `DiffusionProbModel`,它由多层全连接神经网络组成。我们还定义了一个数据增广函数 `data_augmentation`,它利用扩散概率模型对输入数据进行增广。具体实现过程如下: 对于输入的数据 `data`,我们首先对每个样本生成一个相同大小的随机噪声 `noise`。接着,我们对每个样本的每个时间步 `j`,对每个特征 `k`,分别进行如下的增广过程: - 首先,我们利用扩散概率模型 `diffusion_prob_model` 计算当前时间步的特征 `x[k]` 在时间步 `j` 时的扩散概率分布 `diff_prob`。 - 接着,我们根据扩散概率分布 `diff_prob`,从时间步 `j` 的所有特征中随机选择一个特征 `idx`,作为当前时间步的新特征值 `x[k]`。 - 最后,我们将当前时间步的新特征值 `x[k]` 加上对应的随机噪声 `noise[j, k]`,得到增广后的特征

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值