2016-03-03 6 views
8

Wie kann ich im Tensorflow Folgendes tun?Manipulation von Matrixelementen im Tensorfluss

mat = [4,2,6,2,3] # 
mat[2] = 0 # simple zero the 3rd element 

Ich kann die eckigen Klammern [] verwenden, da es nur auf Konstanten und nicht auf Variablen arbeitet. Ich kann die Slice-Funktion entweder nicht verwenden, weil das einen Tensor zurückgibt und Sie einem Tensor nicht zuweisen können. Wird

import tensorflow as tf 
sess = tf.Session() 
var1 = tf.Variable(initial_value=[2, 5, -4, 0]) 
assignZerosOP = (var1[2] = 0) # < ------ This is what I want to do 

sess.run(tf.initialize_all_variables()) 

print sess.run(var1) 
sess.run(assignZerosOP) 
print sess.run(var1) 

drucken

[2, 5, -4, 0] 
[2, 5, 0, 0]) 

Antwort

11

Sie nicht einen Tensor ändern können - aber, wie Sie erwähnt, können Sie eine Variable ändern.

Es gibt drei Muster, die Sie nutzen könnten, um zu erreichen, was Sie wollen:

(a) Verwendung tf.scatter_update direkt zu stecken, um den Teil der Variablen, die Sie ändern möchten.

import tensorflow as tf 

a = tf.Variable(initial_value=[2, 5, -4, 0]) 
b = tf.scatter_update(a, [1], [9]) 
init = tf.initialize_all_variables() 

with tf.Session() as s: 
    s.run(init) 
    print s.run(a) 
    print s.run(b) 
    print s.run(a) 

[2 5 -4 0]

[2 9 -4 0]

[2 9 -4 0]

(b) Erstellen zwei tf.slice() s des Tensors, mit Ausnahme des Elements, das Sie ändern möchten, und dann tf.concat(0, [a, 0, b]) sie wieder zusammen.

(c) Erstellen b = tf.zeros_like(a) und dann tf.select() verwenden, um auszuwählen, welche Elemente aus a Sie wollen, und die Nullen von b, die Sie wollen.

Ich habe (b) und (c) eingeschlossen, weil sie mit normalen Tensoren arbeiten, nicht nur mit Variablen.

+0

Vielen Dank, es war auf jeden Fall eine Hilfe und ich könnte damit arbeiten, aber es wäre etwas kämsig. Was, wenn ich tatsächlich den Tensor ändern müsste? Gibt es keine Möglichkeit, das zu tun? Ich möchte Netzwerkvisualisierung implementieren und ich muss ein Bild bis zu einer Aktivierungsschicht propagieren, alle Aktivierungen mit Ausnahme einer zufälligen ein Null und dann propagieren das zurück. – Shagas

+0

Tensoren sind unveränderlich. Wenn Sie den Status speichern und ändern möchten, speichern Sie ihn im Allgemeinen in einer Variablen, die Sie * mutieren können. Aber ansonsten erstellst du einfach einen neuen Tensor, der vom Original abgeleitet ist und dieses benutzt. In dem Fall, dass Sie beschreiben, ist das wahrscheinlich der Ansatz. – dga

+0

Danke für die Antwort. Ich löste das Problem, indem ich einen neuen Tensor verwendete, der vom Original abgeleitet wurde, wie Sie es vorgeschlagen hatten. – Shagas