2015-11-13 7 views
5

Czy istnieje sposób na wyodrębnienie przekątnej kwadratowej macierzy w programie TensorFlow? Oznacza to, że do matrycy jak ten:Uzyskaj przekątną macierzy w TensorFlow

[ 
[0, 1, 2], 
[3, 4, 5], 
[6, 7, 8] 
] 

chcę sprowadzić elementy: [0, 4, 8]

W numpy, to jest całkiem prosta poprzez np.diag:

W TensorFlow, istnieje diag function, ale tworzy ona tylko nową macierz z elementami określonymi w argumencie na przekątnej, co nie jest tym, czego chcę.

Mogę sobie wyobrazić, jak można to osiągnąć poprzez kroczenie ... ale nie widzę kroczenia po tensorach w TensorFlow.

Odpowiedz

8

z tensorflow 0,8 jego ewentualnego aby wyodrębnić ukośne elementy z tf.diag_part() (patrz documentation

2

Jest to prawdopodobnie obejście, ale działa.

>> sess = tensorflow.InteractiveSession() 
>> x = tensorflow.Variable([[1,2,3],[4,5,6],[7,8,9]]) 
>> x.initializer.run() 
>> z = tensorflow.pack([x[i,i] for i in range(3)]) 
>> z.eval() 
array([1, 5, 9], dtype=int32) 
+0

Niestety operacja ta może być niezwykle powolne, choć nie wiem, dlaczego. – Literal

2

Obecnie możliwe jest wyodrębnianie elementów ukośnych za pomocą tf.diag_part. Oto ich przykład:

# 'input' is [[1, 0, 0, 0] 
       [0, 2, 0, 0] 
       [0, 0, 3, 0] 
       [0, 0, 0, 4]] 

tf.diag_part(input) ==> [1, 2, 3, 4] 

Old odpowiedź (gdy diag_part) nie był dostępny (wciąż istotne, jeśli chcemy osiągnąć coś, co nie jest już dostępny):

Po patrząc choć math operations i tensor transformations, nie wygląda na to, że taka operacja istnieje. Nawet jeśli można wyodrębnić te dane za pomocą multiplikacji macierzy, to nie byłoby to wydajne (uzyskać przekątną jest O(n)).

Masz trzy podejścia, zaczynając od łatwych do trudnych.

  1. Ocenić tensor, wyciąg przekątnej z numpy, zbudować zmienną TF
  2. Korzystanie tf.pack w sposób Anurag sugerowanej (także wyodrębnić wartość 3 przy użyciu tf.shape
  3. Napisz op in C++, odbudowania TF i wykorzystania to natywnie.
+0

Brzmi rozsądnie. Dzięki! – theaNO

0

Użyj operację gather.

x = tensorflow.Variable([[1,2,3],[4,5,6],[7,8,9]]) 
x_flat = tf.reshape(x, [-1]) # flatten the matrix 
x_diag = tf.gather(x, [0, 3, 6]) 
0

W zależności od kontekstu, maska ​​może być dobry sposób na `anulować” off ukośne elementy macierzy, szczególnie jeśli planujesz w zmniejszaniu to tak:

mask = tf.diag(tf.ones([n])) 
y = tf.mul(mask,y) 
cost = -tf.reduce_sum(y) 
2

Użyj tf.diag_part()

with tf.Session() as sess: 
    x = tf.ones(shape=[3, 3]) 
    x_diag = tf.diag_part(x) 
    print(sess.run(x_diag))