我有一个张量 in
的形状(batch_size, features, steps),并希望得到一个输出张量。out
通过在时间维度(步长)上平均汇集相同形状的数据,窗口大小为 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
但该图层总是集中在整个序列上,不允许我指定窗口大小。我怎样才能执行这个操作呢?带遮罩和一个窗口大小?
据我所知,TensorFlow中没有这样的操作。但是,可以使用两种无遮蔽的池化操作的组合,这里用伪代码来写。
seq_mask
做 顺序掩码 形状 (batch_size, time)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
.