深度信号处理:利用卷积神经网络测量距离

简介: 深度信号处理:利用卷积神经网络测量距离

在信号处理中,有时需要测量信号某些特征(例如峰)之间的水平距离。一个很好的例子就是解释心电图(ECG),这在很大程度上取决于测量距离。 我们将考虑下图中只有两个峰的平滑信号的一个样例。

640.png

解决这个问题很简单,可以通过找到峰值,然后减去它们的X坐标来测量它们之间的水平距离来解决。这可以通过使用可用的工具和库有效地完成。然而,我们的目标是训练一个神经网络来预测两个峰之间的距离。一旦我们证明了神经网络可以处理这一任务,我们就可以在更复杂的端到端学习任务中重用相同的架构,而测量距离只是学习更复杂关系的一种手段。这源于深度学习的理念,即我们应该尝试让神经网络学习特征,而不是让工程师手工编码特征并希望这些特征是最相关的。如果我们能证明神经网络可以学习距离特征,我们就可以在更复杂的网络中使用它,在这些网络中,最终结果将取决于距离以外的许多其他因素。这些任务的典型例子是解释心电图或天文数据。

生成数据

在我们的实验中,我们将使用生成训练和测试数据的生成器函数生成如上图所示的信号。

defget_signal_generator(batch_size, n_points, mean_distance, std_distance,
mean_width, std_width):
defgenerate_one():
first=np.random.uniform(0, n_points/4)
second=first+np.random.normal(mean_distance*n_points, std_distance*n_points)
ifsecond>n_points*0.95:
second=n_points*0.95distance=second-firstfirst_width=max(np.random.normal(mean_width*n_points, std_width*n_points), n_points*std_width)
second_width=max(np.random.normal(mean_width*n_points, std_width*n_points), n_points*std_width)
data_range=np.arange(n_points)
signal=norm.pdf(data_range, first, first_width) +\norm.pdf(data_range, second, second_width)
returnsignal, distancedefgenerate():
sanity=100000for_inrange(sanity):
all_data= [generate_one() for_inrange(batch_size)]
yieldnp.vstack([element[0] forelementinall_data]), np.vstack([element[1] forelementinall_data])
returngenerate()

这是一个python生成器函数,意味着它使用yield关键字而不是return。每次在生成器上调用next()函数时,都会产生下一个结果。此功能生成正好具有两个峰值的信号。所有信号的长度完全相同。第一个峰值的位置均匀分布在信号的第一象限中,但是第二个峰值的位置呈正态分布,但是我们还要确保它不会超出范围。峰的宽度也呈正态分布。我们分批返回峰,这对神经网络的训练和评估很有用。

请注意,此生成器实际上会生成无限量的数据!因此,对于我们的示例可以尝试实现尽可能高的精度。

找到峰值

现在我们有了生成器函数,我们可以使用标准信号处理库来找到峰值之间的距离。我们将使用scipy库和函数find_peaks()来查找峰值。我们使用R2评分来评估模型。如下图所示,我们得到了近乎完美的分数,预测误差主要是由于数字舍入误差造成的。

defpredict_distance(batch):
defcompute_distance(row):
peaks=find_peaks(row)[0]
iflen(peaks) <2:
return0returnabs(peaks[1] -peaks[0])
returnnp.vstack([compute_distance(batch[i,:]) foriinrange(batch.shape[0])])
np.random.seed(2128506)
data_generator=get_signal_generator(500, 1000, 0.7, 0.1, 0.03, 0.01)
batch_x, batch_y=next(data_generator)
predictions=predict_distance(batch_x)
print('Baseline performance: ', r2_score(batch_y, predictions))
Baselineperformance: 0.9999812121197582

使用CNN来测量距离

在设计神经网络时,想象一个人类操作员会做什么通常是很有用的。在我们的例子中,操作是测量,测量的工具是一把尺子。在我们的例子中,我们使用一个一维卷积层来模拟标尺,并将内核大小设置为信号的最大长度。这样做原因是,如果层的值从0,1,2,3,4,…当乘以信号,它将准确地给我们的位置的峰值。我们使用了两个滤波器来测量两个峰值的位置,然后添加两个全连接层,让神经网络学习如何获取这两个测量值之间的差异。

640.png

我们使用Tensorflow和Keras实现神经网络。请注意,由于Conv1D需要三维张量,因此我们添加了一个Reshape图层,该图层添加了尺寸1的第三个尺寸。批量尺寸是隐式假定的。对于卷积层,我们不使用任何激活函数,因为我们希望该层的行为类似于标尺。注意,我们不使用任何下采样机制(最大池化或平均池化)。我相信这些不是必需的,实际上会降低精度,因为它们会使测量变得不那么精确。在将数据发送到Dense层之前,我们添加Flatten层以将尺寸(批处理尺寸除外)折叠为单个尺寸,因为这是Dense层所期望的。

model=Sequential([
Input(shape=(1000,)),
Reshape((-1,1)),      
Conv1D(filters=2, kernel_size=1000, activation=None),
Flatten(),
Dense(16, activation='relu'),
Dense(16, activation='relu'),
Dense(1)
])
model.compile(optimizer=Adam(lr=0.7), loss='mse')
model.summary()

结果如下:

Model: "sequential_26"_________________________________________________________________Layer (type)                 OutputShapeParam#=================================================================reshape_26 (Reshape)         (None, 1000, 1)           0_________________________________________________________________conv1d_33 (Conv1D)           (None, 1, 2)             2002_________________________________________________________________flatten_25 (Flatten)         (None, 2)                 0_________________________________________________________________dense_63 (Dense)             (None, 16)               48_________________________________________________________________dense_64 (Dense)             (None, 16)               272_________________________________________________________________dense_65 (Dense)             (None, 1)                 17=================================================================Totalparams: 2,339Trainableparams: 2,339Non-trainableparams: 0_________________________________________________________________

正如我们所看到的,这个模型只有2339个参数,所以它是一个非常简单的模型。我们在50个伦茨内训练模型,但是我们也添加了早期停止回调,以便在模型停止改进时停止执行。我们添加另一个回调函数TerminateOnNaN,如果梯度或损失变成NaN,它将停止训练过程。我们将一个生成器函数传递给fit()方法。这是现在推荐的将数据传递给模型的方法,特别是当数据量很大时。在我们的例子中,生成器不断地生成随机的例子,实际上是无限的例子!由于我们的生成器函数没有epoch的概念,我们需要定义一个参数steps_per_epoch,否则模型将认为所有批次都属于第一个epoch,并且训练将永远不会结束。

np.random.seed(2128506)
tf.random.set_seed(2128506)
data_generator=get_signal_generator(500, 1000, 0.7, 0.1, 0.03, 0.01)
model.fit(data_generator, epochs=50, steps_per_epoch=100, callbacks=[EarlyStopping(monitor='loss'), TerminateOnNaN()])

训练过程如下:

Epoch1/50100/100 [==============================] -16s157ms/step-loss: 55010.6915Epoch2/50100/100 [==============================] -16s161ms/step-loss: 186.3050Epoch3/50100/100 [==============================] -16s160ms/step-loss: 89.9977Epoch4/50100/100 [==============================] -16s159ms/step-loss: 229.8199

下面我们看一下结果:

time.sleep(1)
batch_x, batch_y=next(data_generator)
predictions=model.predict(batch_x)
print('R^2 score: ', r2_score(batch_y, np.squeeze(predictions)))
R^2score: 0.996036173273703

在训练一个模型后,我们看到测试集的分数确实令人印象深刻。虽然我们承认进一步改进算法是可能的,但我们得到的结果证明了我们的简单方法确实有效。

总结

在设计一个神经网络时,想象人类的感知和认知是如何工作的往往是成功的关键。我们如何产生高层次的特征和概念通常能够指导我们进行神经网络的架构搭建。这种方法的示例之一是注意力机制,注意力机制是根据我们根据阅读的文本进行归纳总结时的注意力进行建模的。在这个问题中,代表了人类活动指导神经网络构建的另一个示例。尽管使用CNN来测量距离(与Attention机制一样)本身并没有用,但是只要我们相信水平距离起作用,就可以将此结构并入更大的神经网络来解决更复杂的任务。

目录
相关文章
|
6月前
|
机器学习/深度学习 PyTorch TensorFlow
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
|
7月前
|
机器学习/深度学习 人工智能 算法
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic带你深入卷积神经网络(CNN)核心技术,从生物启发到数学原理,详解ResNet、注意力机制与模型优化,探索视觉智能的演进之路。
619 11
|
10月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
本内容展示了一种基于粒子群优化(PSO)与时间卷积神经网络(TCN)的时间序列预测方法。通过 MATLAB2022a 实现,完整程序运行无水印,核心代码附详细中文注释及操作视频。算法利用 PSO 优化 TCN 的超参数(如卷积核大小、层数等),提升非线性时间序列预测性能。TCN 结构包含因果卷积层与残差连接,结合 LSTM 构建混合模型,经多次迭代选择最优超参数,最终实现更准确可靠的预测效果,适用于金融、气象等领域。
|
7月前
|
机器学习/深度学习 传感器 数据采集
【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
450 0
|
9月前
|
机器学习/深度学习 人工智能 PyTorch
零基础入门CNN:聚AI卷积神经网络核心原理与工业级实战指南
卷积神经网络(CNN)通过局部感知和权值共享两大特性,成为计算机视觉的核心技术。本文详解CNN的卷积操作、架构设计、超参数调优及感受野计算,结合代码示例展示其在图像分类、目标检测等领域的应用价值。
495 7
|
11月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于PSO(粒子群优化)改进TCN(时间卷积神经网络)的时间序列预测方法。使用Matlab2022a运行,完整程序无水印,附带核心代码中文注释及操作视频。TCN通过因果卷积层与残差连接处理序列数据,PSO优化其卷积核权重等参数以降低预测误差。算法中,粒子根据个体与全局最优位置更新速度和位置,逐步逼近最佳参数组合,提升预测性能。
|
10月前
|
机器学习/深度学习 数据采集 监控
基于CNN卷积神经网络和GEI步态能量提取的步态识别算法matlab仿真,对比不同角度下的步态识别性能
本项目基于CNN卷积神经网络与GEI步态能量提取技术,实现高效步态识别。算法使用不同角度(0°、45°、90°)的步态数据库进行训练与测试,评估模型在多角度下的识别性能。核心流程包括步态图像采集、GEI特征提取、数据预处理及CNN模型训练与评估。通过ReLU等激活函数引入非线性,提升模型表达能力。项目代码兼容Matlab2022a/2024b,提供完整中文注释与操作视频,助力研究与应用开发。
|
10月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于WOA鲸鱼优化的TCN-GRU时间卷积神经网络时间序列预测算法matlab仿真
本内容包含时间序列预测算法的相关资料,涵盖以下几个方面:1. 算法运行效果预览(无水印);2. 运行环境为Matlab 2022a/2024b;3. 提供部分核心程序,完整版含中文注释及操作视频;4. 理论概述:结合时间卷积神经网络(TCN)与鲸鱼优化算法(WOA),优化TCN超参数以提升非线性时间序列预测性能。通过因果卷积层与残差连接构建TCN模型,并用WOA调整卷积核大小、层数等参数,实现精准预测。适用于金融、气象等领域决策支持。
|
10月前
|
机器学习/深度学习 数据采集 并行计算
基于WOA鲸鱼优化的TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于TCN(Temporal Convolutional Network)与WOA(Whale Optimization Algorithm)的时间序列预测算法。TCN通过扩张卷积捕捉时间序列长距离依赖关系,结合批归一化和激活函数提取特征;WOA用于优化TCN网络参数,提高预测精度。算法流程包括数据归一化、种群初始化、适应度计算及参数更新等步骤。程序基于Matlab2022a/2024b开发,完整版含详细中文注释与操作视频,运行效果无水印展示。适用于函数优化、机器学习调参及工程设计等领域复杂任务。
|
10月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化TCN-GRU时间卷积神经网络时间序列预测算法matlab仿真
本内容涵盖基于粒子群优化(PSO)与时间卷积神经网络(TCN)的时间序列预测算法。完整程序运行效果无水印,适用于Matlab2022a版本。核心代码配有详细中文注释及操作视频。理论部分阐述了传统方法(如ARIMA)在非线性预测中的局限性,以及TCN结合PSO优化超参数的优势。模型由因果卷积层和残差连接组成,通过迭代训练与评估选择最优超参数,最终实现高精度预测,广泛应用于金融、气象等领域。

热门文章

最新文章