2017-07-01 4 views
2

Ich habe eine riesige globale Variable sowohl durch den Zug und die Bewertung verwendet, sondern mit unterschiedlicher Form. Jetzt, da ich versuche, sowohl die Auswertung als auch den Zug im selben Prozess auszuführen, stolperte ich über die Tatsache, dass ich die in einem Tensorflussgraphen definierten Variablen nicht wirklich löschen kann. Der Workaround, der beispielsweise für here vorgeschlagen wird, besteht darin, die reset_default_graph() zu verwenden, aber das scheint nicht mit dem Graphenkontextmanager zu spielen.Zurücksetzen einer Grafik in Tensorflow

import numpy as np 
import tensorflow as tf 

GRAPH = tf.Graph() 

def train(examples): 
    with GRAPH.as_default() as g: 
     # actually this is huge variable 
     global_var = tf.get_variable('global_var', 
            initializer=np.full((examples, 32), 0.0), 
            trainable=False) 

def evaluate(examples): 
    # tf.reset_default_graph() # ValueError: Variable input_var already exists 
    with GRAPH.as_default() as g: # initialized to some other size 
     tf.reset_default_graph() 
     global_var = tf.get_variable('global_var', 
            initializer=np.full((examples, 32), 0.0), 
            trainable=False) 
     # in fact tensorflow creates a new graph and does not use GRAPH to define global_var 

train(32) 
evaluate(8) 

Ergebnisse in:

Traceback (most recent call last): 
    File "C:/Users/MrD/.PyCharm2017.1/config/scratches/scratch_44.py", line 22, in <module> 
    evaluate(8) 
    File "C:/Users/MrD/.PyCharm2017.1/config/scratches/scratch_44.py", line 19, in evaluate 
    trainable=False) 
    File "C:\_\Python35\lib\contextlib.py", line 66, in __exit__ 
    next(self.gen) 
    File "C:\_\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 3616, in get_controller 
    if self.stack[-1] is not default: 
IndexError: list index out of range 

Also, was ist der richtige Weg reset_default_graph() zu verwenden? Gibt es wirklich keine Möglichkeit, eine Variable neu zu definieren, die den alten, möglicherweise riesigen Initialisierer verworfen hat?

+0

[Dies] (https://stackoverflow.com/questions/39352865/resetting-default-graph -does-not-remove-variables) antwortet, warum es nicht funktioniert, nicht sicher, ob die vorgeschlagene Lösung auch zu Ihrem Problem passt. – user1735003

+0

Danke @ user1735003 - irgendwelche Ideen, wie ich dann über diese Variable verfügen könnte (kann aus Platzgründen keine Platzhalter verwenden)? –

+0

Vielleicht könnte 'tf.assign' für Sie arbeiten? (mit 'validate_shape = Falsch') – user1735003

Antwort

2

Es stellt sich heraus, dass es nicht sinnvoll ist, das Standarddiagramm innerhalb eines Graphenkontextmanagers zurückzusetzen - siehe: https://github.com/tensorflow/tensorflow/issues/11121. Neuere Versionen eine hilfreiche Fehlermeldung hinzufügen sollen:

AssertionError: Do not use tf.reset_default_graph() to clear nested graphs. If you need a cleared graph, exit the nesting and create a new graph. 

wie oben in der Frage diskutiert und umgesetzt here

Verwandte Themen