使用Tensorflow进行简单的平均池化

时间:2018-10-04 12:42:26

标签: tensorflow keras pooling

我正在尝试在Keras / Tensorflow张量(不是网络中的一层)上进行一些非常简单的平均池化。我有18个嵌入的列表(嵌入= 2D矢量),并希望将其平均池化为3个池大小,且没有重叠。因此,前3个嵌入应平均为一个嵌入,然后再平均3个,依此类推。最后,我需要一个18/3 = 6个嵌入的列表。

到目前为止,这是我的代码:

    sequence_len = 3 # The number of embeddings that should be averaged
    feature_dim = 2 # the dimensions of embeddings
    input = [
        [1, 3],  # Anchor 1
        [2, 2],
        [3, 1],
        [4, 1],  # Anchor 2
        [6, 1],
        [8, 1],
        [12, 3],  # Positive 1
        [0, 6],
        [0, 0],
        [1, 1],  # Positive 2
        [1, 1],
        [1, 1],
        [5, 0],  # Negative 1
        [5, 12],
        [5, 0],
        [1, 1],  # Negative 2
        [1, 1],
        [1, 1],
    ]
    expected_out = [
        [2, 2],  # Anchor 1
        [6, 1],  # Anchor 2
        [4, 3],  # Positive 1
        [1, 1],  # Positive 2
        [5, 4],  # Negative 1
        [1, 1],  # Negative 2
    ]
    input_tensor = K.variable(input)
    output_tensor = a_function_i_cant_figure_out(input_tensor) # What's the API to call?
    assert numpy.array_equal(K.eval(output_tensor), expected_out)

我现在已经花了2多个小时,无法弄清楚。我不明白如何重整数据才能使其与pooling function一起使用。

我遇到一个可行的解决方案,即将我的输入内容包装在另外两个列表中(使其形状为(1,1,18,2)),并将其命名为

output_tensor = K.pool2d(foo, (3, 2), (3, 2), pool_mode="avg", data_format="channels_first")

但这也将嵌入本身取平均值。因此,我收到的不是[[2,2], [6,1], ...],而是[2, 3.5, ...]

这似乎是一件微不足道的操作-我该怎么做?

1 个答案:

答案 0 :(得分:0)

好,知道了:

output_tensor = K.tf.nn.pool(input_tensor, [1, sequence_len], strides=(1, sequence_len), pooling_type="AVG", padding="VALID")

将我的数据视为2D矩阵。

[1, sequence_len]是池/窗口的大小。因此,在X方向上,宽度为1,在Y方向上,高度为sequence_len。这意味着:sequence_len行的第一个值将合并为一个值。那么(1, sequence_len)的步幅就意味着:我们将池在X方向上移动1,一旦完成该行,我们就将池向下移动sequence_len

我们对数据使用宽度为1的X步距为1列,这意味着我们的输出具有相同的宽度。在Y方向上,我们将sequence_len行合并为1行,然后进行不重叠的下sequence_len行。因此我们的输出高度为original_height / sequence_len