首页 文章

Tensorflow扫描具有偏移的多个矩阵行

提问于
浏览
0

问题

我想扫描类似于Tensorflow的 tf.scan() 的矩阵,但是一次使用多行 . 所以给定一个 [n, m] 矩阵,我希望能够从 i + jm 迭代 m 行( n 个元素),给出 m - j 形状切片 [i - j, n] .

怎么能实现这一目标?

我知道 tf.scan 如何做这样的事情,返回每次迭代的累积值 . 但我不认为移动矩阵会因为多个输入解决了这个问题,因为具有偏移的值无法预先计算 .

示例

举一个 n = 3m = 5 的例子,假设我有一个如下所示的矩阵:

# [[1 0 0]
#  [1 1 0]
#  [0 0 0]   row 3
#  [0 0 0]   row 4
#  [0 0 0]]  row 5

matrix_shape = [5, 3]
matrix_idx = tf.constant([[0, 0], [1, 0], [1, 1]])
matrix = tf.scatter_nd(matrix_idx,
                       tf.ones(tf.shape(matrix_idx)[0],
                               dtype=tf.int32),
                       matrix_shape)

我想从第3行到第5行应用以下函数:

# [[ 1  0  0]    ┌ a
#  [ 1  1  0]    ├ b
#  [ 6  4  2]  <─┴ output / current line
#  [16 12  6]
#  [46 34 18]]

def compute(x):
    a = x[0]
    b = x[1]
    return (a + b + 1) * 2

Tensorflow是否具有针对此问题的特定功能?

1 回答

  • 0

    我写的以下代码完全符合我的要求 .

    这里重要的部分是 tf.scan 使用的函数 return ,它不仅返回当前计算 c ,还返回上一步 b 中的行 . 因此,重要的是稍后通过仅使用 [1] 选择此列表中的后期张量来从 computation 中切除这些过量 .

    #!/usr/bin/env python3
    import tensorflow as tf
    
    def compute(x, _):
        a = x[0]
        b = x[1]
        c = (a + b + 1) * 2
        return (b, c)
    
    matrix_shape = tf.constant([3, 3])
    init_data = [[1, 0, 0], [1, 1, 0]]
    initializer = (
        tf.constant(init_data[0]),
        tf.constant(init_data[1]),
    )
    matrix = tf.zeros(matrix_shape, dtype=tf.int32)
    computation = tf.scan(compute, matrix, initializer)[1]
    result = tf.concat((tf.constant(init_data), computation), axis=0)
    
    with tf.Session() as sess:
        sess.run(result)
        print(result.eval())
    

    由于我还缺乏经验:可能这个解决方案对性能有害,因为函数返回一个元组,因此没有使用Tensorflow的速度优化?

相关问题