我正在尝试在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, ...]
这似乎是一件微不足道的操作-我该怎么做?
答案 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