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
前后时间步的时间步,我只想计算现有时间步的平均值。
但是,张量中的序列具有可变长度并相应地用零填充,我将序列长度存储在另一个张量中(并且可以例如用它们创建一个掩码)。
- 我知道我可以使用
out = tf.nn.avg_pool1d(in, ksize=2k+1, strides=1, padding="SAME", data_format="NCW")
来执行我描述的池操作,但是它不理解我的序列用零填充并且不允许我传递具有序列长度的掩码。
- 还有
tf.keras.layers.GlobalAveragePooling1D
,但该层总是汇集整个序列,不允许我指定 window 大小。
如何使用掩码和 window 大小 执行此操作?
据我所知,TensorFlow中没有这样的操作。但是,可以使用两个未屏蔽的池化操作的组合,这里用伪代码编写:
- 设
seq_mask
为sequence mask形状(batch_size,时间)
- 设
in_pooled
为张量 in
,具有未屏蔽的平均池化
- 设
seq_mask_pooled
为张量 seq_mask
,具有相同池大小的未屏蔽平均池
- 获取张量
out
如下: out
的每个元素,其中序列掩码为0
,也应为0
。通过将 in_pooled
除以 seq_mask_pooled
元素来获得每个其他元素(并不是说 seq_mask_pooled
的元素永远不会 0
如果 seq_mask
的元素不是) .
张量 out
例如使用 tf.math.divide_no_nan
.
计算
我有一个形状为(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
前后时间步的时间步,我只想计算现有时间步的平均值。
但是,张量中的序列具有可变长度并相应地用零填充,我将序列长度存储在另一个张量中(并且可以例如用它们创建一个掩码)。
- 我知道我可以使用
out = tf.nn.avg_pool1d(in, ksize=2k+1, strides=1, padding="SAME", data_format="NCW")
来执行我描述的池操作,但是它不理解我的序列用零填充并且不允许我传递具有序列长度的掩码。 - 还有
tf.keras.layers.GlobalAveragePooling1D
,但该层总是汇集整个序列,不允许我指定 window 大小。
如何使用掩码和 window 大小 执行此操作?
据我所知,TensorFlow中没有这样的操作。但是,可以使用两个未屏蔽的池化操作的组合,这里用伪代码编写:
- 设
seq_mask
为sequence mask形状(batch_size,时间) - 设
in_pooled
为张量in
,具有未屏蔽的平均池化 - 设
seq_mask_pooled
为张量seq_mask
,具有相同池大小的未屏蔽平均池 - 获取张量
out
如下:out
的每个元素,其中序列掩码为0
,也应为0
。通过将in_pooled
除以seq_mask_pooled
元素来获得每个其他元素(并不是说seq_mask_pooled
的元素永远不会0
如果seq_mask
的元素不是) .
张量 out
例如使用 tf.math.divide_no_nan
.