我有一个2D
NxN
矩阵,其中包含来自一组实数的元素。我需要从中标识出顶部的n
DxD
子矩阵,以使它们的总和最大,并返回子矩阵的左上索引。我需要在Tensorflow中做到这一点。
例如,我有以下4x4
矩阵:
[1 1 4 4]
[1 1 4 4]
[3 3 2 2]
[3 3 2 2]
我需要确定2个具有最大和的子矩阵,并返回其左上角的索引。在上述情况下,两个具有最大和第二大和的子矩阵是:
[[4 4] [[3 3]
[4 4]] & [3 3]]
我需要返回两个矩阵的左上角索引[[0,2],[2,0]]
。谢谢。
答案 0 :(得分:1)
您可以使用以下代码段来实现。这个想法是建立一个张量,容纳每个子矩阵每个元素的行索引和列索引,然后对子矩阵求和并找到最大的和。
import tensorflow as tf
# Input data
input = tf.placeholder(tf.int32, [None, None])
# Submatrix dimension
dims = tf.placeholder(tf.int32, [2])
# Number of top submatrices to find
k = tf.placeholder(tf.int32, [])
# Sizes
input_shape = tf.shape(input)
rows, cols = input_shape[0], input_shape[1]
d_rows, d_cols = dims[0], dims[1]
subm_rows, subm_cols = rows - d_rows + 1, cols - d_cols + 1
# Index grids
ii, jj = tf.meshgrid(tf.range(subm_rows), tf.range(subm_cols), indexing='ij')
d_ii, d_jj = tf.meshgrid(tf.range(d_rows), tf.range(d_cols), indexing='ij')
# Add indices
subm_ii = ii[:, :, tf.newaxis, tf.newaxis] + d_ii
subm_jj = jj[:, :, tf.newaxis, tf.newaxis] + d_jj
# Make submatrices tensor
subm = tf.gather_nd(input, tf.stack([subm_ii, subm_jj], axis=-1))
# Add submatrices
subm_sum = tf.reduce_sum(subm, axis=(2, 3))
# Use TopK to find top submatrices
_, top_idx = tf.nn.top_k(tf.reshape(subm_sum, [-1]), tf.minimum(k, tf.size(subm_sum)))
# Get row and column
top_row = top_idx // subm_cols
top_col = top_idx % subm_cols
result = tf.stack([top_row, top_col], axis=-1)
# Test
with tf.Session() as sess:
mat = [
[1, 1, 4, 4],
[1, 1, 4, 4],
[3, 3, 2, 2],
[3, 3, 2, 2],
]
print(sess.run(result, feed_dict={input: mat, dims: [2, 2], k: 2}))
输出:
[[0 2]
[1 2]]
请注意,在这种情况下,输出为[0, 2]
和[1, 2]
,但不是[2, 0]
。这是因为从[1, 2]
开始的子矩阵的总和与[2, 0]
处的子矩阵的总和相同,并且如果按行对其进行迭代,则它在矩阵中的前面。如果您在测试中通过了k: 3
,结果中也会得到[2, 0]
。