2017-03-17 1 views
0

Gibt es eine Möglichkeit, alle Variablen zu finden, von denen eine bestimmte Operation (normalerweise ein Verlust) abhängt? Ich möchte dies verwenden, um dann diese Sammlung in optimizer.minimize() oder tf.gradients() mit verschiedenen set().intersection() Kombinationen zu übergeben.Finden Sie alle Variablen, von denen ein Tensorflow abhängig ist

Bisher habe ich op.op.inputs gefunden und versucht, eine einfache BFS auf das, aber ich die Chance nie auf Variable Objekte zurückgegeben durch tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES) oder slim.get_variables()

Es scheint eine Entsprechung zwischen entsprechenden ‚Tensor.op._id zu sein and Variables.op._id` Felder, aber ich bin mir nicht sicher, ob ich mich darauf verlassen sollte.

Oder sollte ich das vielleicht gar nicht machen? I könnte natürlich meine disjoint Mengen von Variablen akribisch beim Erstellen meiner Grafik, aber dann wäre es leicht zu etwas zu verpassen, wenn ich das Modell ändern.

Antwort

1

Die documentation for tf.Variable.op ist nicht besonders klar, aber es bezieht sich auf die entscheidende tf.Operation verwendet in the implementation of a tf.Variable: jeder op, die von dieser Operation auf einem Pfad wird auf einem tf.Variable abhängt. Da das tf.Operation Objekt hashable ist, können Sie es als Schlüssel eines dict verwenden, die tf.Operation Objekte in die entsprechende tf.Variable Objekt abbildet, und dann das BFS als durchführen, bevor:

op_to_var = {var.op: var for var in tf.trainable_variables()} 

starting_op = ... 
dependent_vars = [] 

queue = collections.deque() 
queue.append(starting_op) 

visited = set([starting_op]) 

while queue: 
    op = queue.popleft() 
    try: 
    dependent_vars.append(op_to_var[op]) 
    except KeyError: 
    # `op` is not a variable, so search its inputs (if any). 
    for op_input in op.inputs: 
     if op_input.op not in visited: 
     queue.append(op_input.op) 
     visited.add(op_input.op) 
+0

könnte es ein Problem mit dieser unendlich looping ... Ich habe es versucht, und es hing. Ich fügte ein 'set' hinzu, um zu verfolgen, welche' Op's bereits in der 'Queue' waren, und sie kehrte sofort zurück – eqzx

+0

Du hast recht! Der ursprüngliche Code würde fehlschlagen, wenn der Graph einen Zyklus enthält. Ich habe es aktualisiert, um ein "besuchtes" Set zu verwenden. – mrry

Verwandte Themen