2015-11-13 7 views
5

Gibt es eine Möglichkeit, die Diagonale einer quadratischen Matrix in TensorFlow zu extrahieren? Das heißt, für eine Matrix wie folgt aus:Erhalten Sie die Diagonale einer Matrix in TensorFlow

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

Ich möchte die Elemente holen: [0, 4, 8]

In numpy ist dies ziemlich geradlinig über np.diag:

In TensorFlow gibt es eine diag function, aber es bildet nur eine neue Matrix mit den Elementen im Argument auf der Diagonalen angegeben, was nicht das ist, was ich will.

Ich könnte mir vorstellen, wie das über Schreiten gemacht werden könnte ... aber ich sehe keine Tensoren in TensorFlow.

Antwort

8

mit tensorflow 0,8 seinem möglich denen extrahieren Diagonalelemente mit tf.diag_part() (siehe documentation

2

Dies ist wahrscheinlich ein Workaround, aber funktioniert.

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

Leider ungeheuer langsam, nicht sicher, warum, obwohl kann dieser Vorgang sein. – Literal

2

Derzeit ist es möglich, diagonale Elemente mit tf.diag_part zu extrahieren. Hier ist ihr Beispiel:

# '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] 

Alte Antwort (wenn diag_part) nicht verfügbar war (noch relevant, wenn Sie etwas erreichen wollen, die nicht verfügbar ist):

Nach einem Blick obwohl die math operations und tensor transformations, sieht es nicht so aus, dass eine solche Operation existiert. Selbst wenn Sie diese Daten mit Matrixmultiplikationen extrahieren können, wäre es nicht effizient (get diagonal ist O(n)).

Sie haben drei Ansätze, beginnend mit einfach bis schwer.

  1. Evaluieren der Tensor, mit numpy diagonal extrahieren, eine Variable mit TF
  2. Verwenden tf.pack in einer Art und Weise Anurag vorgeschlagen (auch den Wert extrahieren 3 unter Verwendung von tf.shape
  3. Schreiben Sie Ihre eigene op in C++, wieder aufzubauen TF und Nutzung bauen nativ es.
+0

Klingt vernünftig. Vielen Dank! – theaNO

0

Verwenden sie den gather Betrieb.

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

Je nach Kontext kann eine Maske ein schöner Weg, um'Abbrechen‘off Diagonalelemente der Matrix, vor allem, wenn Sie es bei der Verringerung der ohnehin planen:

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

der tf.diag_part verwenden()

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