window 可变长度序列的平均池化

Average pooling with window over variable length sequences

我有一个形状为(batch_size、特征、步骤)的张量 in,我想通过时间维度上的平均池化来获得相同形状的输出张量 out (步数)window 大小为 2k+1,即:

out[b,f,t] = 1/(2k+1) sum_{t'=t-k,...,t+k} in[b,f,t']

对于没有 k 前后时间步的时间步,我只想计算现有时间步的平均值。

但是,张量中的序列具有可变长度并相应地用零填充,我将序列长度存储在另一个张量中(并且可以例如用它们创建一个掩码)。

如何使用掩码和 window 大小 执行此操作

据我所知,TensorFlow中没有这样的操作。但是,可以使用两个未屏蔽的池化操作的组合,这里用伪代码编写:

  1. seq_masksequence mask形状(batch_size,时间)
  2. in_pooled 为张量 in,具有未屏蔽的平均池化
  3. seq_mask_pooled 为张量 seq_mask,具有相同池大小的未屏蔽平均池
  4. 获取张量out如下: out的每个元素,其中序列掩码为0,也应为0。通过将 in_pooled 除以 seq_mask_pooled 元素来获得每个其他元素(并不是说 seq_mask_pooled 的元素永远不会 0 如果 seq_mask 的元素不是) .

张量 out 例如使用 tf.math.divide_no_nan.

计算