2017-05-02 3 views
0

Nach kurzem meine TensorFlow Version zu aktualisieren, ich begegnet diesen Fehler, die ich nicht in der Lage bin zu lösen:TensorFlow: Wie kann ich Adam-Optimizer-Variablen wiederverwenden?

Traceback (most recent call last): 
    File "cross_train.py", line 177, in <module> 
    train_network(use_gpu=True) 
    File "cross_train.py", line 46, in train_network 
    with tf.control_dependencies([s_opt.apply_gradients(s_grads), s_increment_step]): 

... 

ValueError: Variable image-conv1-layer/weights/Adam/ already exists, disallowed. Did you mean to set reuse=True in VarScope? Originally defined at: 

    File "cross_train.py", line 34, in train_network 
    with tf.control_dependencies([e_opt.apply_gradients(e_grads), e_increment_step]): 
    File "cross_train.py", line 177, in <module> 
    train_network(use_gpu=True) 

Meine Modellarchitektur ist 3 verschiedene Faltungs neuronales Netz Zweige: M, E, S. Im Training I Ich versuche, die Schritte zu wechseln, in denen ich die Proben durch M & E (Punktproduktabstand ihrer Einbettungen) propagieren und mit Adam aktualisieren; dann propagiere Proben durch M & S und update mit Adam; und wiederholen. Also im Grunde ist M fixiert (wird bei jedem Schritt aktualisiert), aber E- und S-Zweige werden abwechselnd aktualisiert.

Als solche habe ich zwei Instanzen von AdamOptimizer (e_opt und s_opt) aber ich habe den Fehler, da die Gewichtungsvariable M-conv1/weights/Adam/ bereits vorhanden ist, wenn ich versuche, den S Zweig zu aktualisieren.

Dies geschah nicht mit mir, bevor ich meine TensorFlow Version aktualisierte. Ich weiß, wie die Wiederverwendung von Variablen setzen im Allgemeinen in TensorFlow, zum Beispiel:

with tf.variable_scope(name, values=[input_to_layer]) as scope: 
    try: 
     weights = tf.get_variable("weights", [height, width, input_to_layer.get_shape()[3], channels], initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32)) 
     bias = tf.get_variable("bias", [channels], initializer=tf.constant_initializer(0.0, dtype=tf.float32)) 
    except ValueError: 
     scope.reuse_variables() 
     weights = tf.get_variable("weights", [height, width, input_to_layer.get_shape()[3], channels], initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32)) 
     bias = tf.get_variable("bias", [channels], initializer=tf.constant_initializer(0.0, dtype=tf.float32)) 

Aber ich bin nicht sicher, ob ich das gleiche für Adam tun können. Irgendwelche Ideen? Hilfe wäre sehr willkommen.

+0

Haben Sie einen Namen für die Optimierung op? 'optimizer = tf.train.AdamOptimizer (learning_rate = 0.0001, name = 'first_optimizer'). minimieren (loss)' –

Antwort

1

Es stellte sich heraus, dass ich nicht zwei verschiedene Adam Optimizer instanziieren musste. Ich habe gerade eine einzelne Instanz erstellt und es gab keinen Namenskonflikt oder ein Problem beim Versuch, Variablen zu teilen. Ich verwende die gleichen Optimierer unabhängig davon, welche Netzwerkzweige aktualisiert werden:

e_grads = opt.compute_gradients(e_loss) 
with tf.control_dependencies([opt.apply_gradients(e_grads), e_increment_step]): 
    e_train = tf.no_op(name='english_train') 

und ...

mit der älteren Version von Tensorflow gibt es kein Problem bei der Verwendung von zwei Adam Instanzen obwohl
s_grads = opt.compute_gradients(s_loss) 
with tf.control_dependencies([opt.apply_gradients(s_grads), s_increment_step]): 
    s_train = tf.no_op(name='spanish_train') 

Interessanter die Namen der M-Verzweigungen sind in Konflikt ...

Verwandte Themen