You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对时序数据执行MaxPooling操作以选取振幅最高的信号?

简洁实现时序数据的全局振幅MaxPooling

你需要的是跨整个时间序列筛选出振幅最高的信号,而非每个时间步单独做空间池化。这里提供两种简洁的TensorFlow实现方式:

方法一:基于空间位置的峰值筛选

直接针对你的data形状([1, 200, 2, 2, 1])操作,步骤清晰:

import tensorflow as tf

# 生成示例数据(复用你的代码)
a = 2*tf.math.sin(tf.linspace(0, 10, 200))
b = 0.1*tf.math.sin(2*tf.linspace(0, 10, 200))
c = 3*tf.math.sin(0.5*tf.linspace(0, 10, 200))
d = 1*tf.math.sin(5*tf.linspace(0, 10, 200))
data = tf.stack([a, b, c, d], -1)
data = tf.reshape(data, [1, 200, 2, 2, 1])

# 1. 计算每个2x2空间位置上信号的全局峰值(跨时间步取最大值)
peak_values = tf.reduce_max(data, axis=1)  # 形状变为 [1, 2, 2, 1]

# 2. 找到峰值最高的空间位置索引
flat_peak = tf.reshape(peak_values, [1, 4])
max_idx = tf.argmax(flat_peak, axis=1)[0]  # 得到对应信号的索引(这里是2,对应信号c)
row, col = max_idx // 2, max_idx % 2

# 3. 提取该位置的完整时间序列
selected_signal = data[0, :, row, col, 0]  # 形状 [200],即信号c的完整时序

方法二:维度重排后的直接筛选

通过维度转换将信号独立出来,操作更直观:

# 1. 重排维度:将4个信号转为独立维度,形状变为 [1, 4, 200]
data_reshaped = tf.transpose(tf.reshape(data, [1, 200, 4]), perm=[0, 2, 1])

# 2. 计算每个信号的全局峰值
signal_peaks = tf.reduce_max(data_reshaped, axis=2)

# 3. 筛选峰值最高的信号
max_signal_idx = tf.argmax(signal_peaks, axis=1)
selected_signal = tf.gather(data_reshaped, max_signal_idx, axis=1, batch_dims=1)
# 输出形状 [1, 200],可通过squeeze转为 [200]
selected_signal = tf.squeeze(selected_signal)

关键说明

  • 之前用MaxPooling3D或TimeDistributed(MaxPooling2D)的问题:这类操作是每个时间步单独对空间维度池化,会丢失时序连续性,无法筛选全局振幅最高的完整信号。
  • 上述方法的核心是先计算每个信号的全局振幅(跨所有时间步的最大值),再定位并提取对应信号的完整时序,完全匹配你的需求。

内容的提问来源于stack exchange,提问作者Vigneswaran C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:07:27