2017-09-05 90 views
3

例如, 我有一個二維張量。添加帶偏移量的張量

array = np.array([1,2,3],[1,2,3],[1,2,3]) 
tensor = tf.constant(array) 

我想計算張量中每列的總和,但要求每一行與其他行相互抵消。

[0,1,2,3,0,0] 
[0,0,1,2,3,0] 
[0,0,0,1,2,3] 

是否有可能有效地執行這種計算?我試圖用SparseTensortf.sparse_reduce_sum計算稀疏表示的總和,但發現它對我的數據大小而言計算效率低下。

+0

hm ....如果'tf.diag_part'支持像'numpy.diagonal'這樣的'offset'參數, –

回答

1

你可以手工構建偏移總和曲線圖:

import tensorflow as tf 
import numpy as np 

array1 = np.array([[1., 2., 3.], 
        [1., 2., 3.], 
        [1., 2., 3.]], dtype=np.float32) 
tensor1 = tf.Variable(tf.constant(array1)) 

array2 = np.array([[1., 2., 3., 4.], 
        [1., 2., 3., 4.], 
        [1., 2., 3., 4.], 
        [1., 2., 3., 4.]], dtype=np.float32) 
tensor2 = tf.Variable(tf.constant(array2)) 

def shifted_sum(tensor): 
    def shifted_sum_one_column(i): 
    s = tf.constant(0., dtype=tf.float32) 
    for j in range(tensor.get_shape()[0]): 
     if 0 <= i - (j + 1) < tensor.get_shape()[1]: 
     s += tensor[tf.constant(j, dtype=tf.int32), 
        tf.constant(i - (j + 1), dtype=tf.int32)] 
    return s 

    result = [] 

    for i in range(tensor.get_shape()[1] + tensor.get_shape()[0]): 
    result.append(shifted_sum_one_column(i)) 

    result = tf.stack(result) 
    return result 

shifted_tensor_1 = shifted_sum(tensor1) 
shifted_tensor_2 = shifted_sum(tensor2) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    print(sess.run(shifted_tensor_1)) 
    print(sess.run(shifted_tensor_2)) 

張量也可以是一個佔位符,但形狀必須事先已知的。