2017-09-05 22 views
3

例、 私は2次元テンソルを持っています。オフセット付きテンソルの追加

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)) 

テンソルもプレースホルダもできますが、形状が事前にわかっていなければなりません。

関連する問題