2017-07-28 1 views
0

Ich verwende Tensorflow scatter_update, um die Werte eines Arrays in einem einfachen Test festzulegen. Ich würde erwarten, dass der folgende Code alle Werte im Array auf 1.0 setzt.Inkonsistente Ergebnisse bei der inkrementellen Zuweisung von Tensorflow mit scatter_update

pt = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] 
numOne = tf.constant(1) 
xi = tf.Variable(0) 
out = tf.Variable(pt) 
tf.global_variables_initializer().run() 

xi_ = xi + numOne 
out_ = tf.scatter_update(out, [xi], [tf.cast(numOne, tf.float32)]) 

step = tf.group(
    xi.assign(xi_), 
    out.assign(out_) 
    ) 
for i in range(15): step.run() 
print(out.eval()) 

Stattdessen erhalte ich inkonsistente Ergebnisse wie:

[ 1. 1. 1. 0. 1. 1. 1. 1. 1. 1. 1. 0. 1. 1. 1. 1.] 

Gibt es irgendeine Art von Verriegelungsmechanismus, dass ich fehle?

+0

Abgesehen von der Tatsache, dass Ihre pt Größe 16, und Sie erwarten, 15 Werte zu füllen, ich denke, es ist etwas los mit der zufälligen Reihenfolge, in der die Ops ausgeführt werden .. – Uvar

Antwort

0

Ops innerhalb tf.group werden in zufälliger Reihenfolge ausgeführt. Wenn Sie bestimmte Reihenfolge möchten, können Sie tf.control_dependencies oder aufgeteilt in zwei .run Anrufe verwenden, dh

step1 = xi.assign(xi_) 
step2 = out.assign(out_) 
for i in range(15): 
    print(out.eval()) 
    sess.run(step1) 
    sess.run(step2) 
0

Auch control_dependencies mit wäre es so etwas wie:

xi_ = xi + numOne 
with tf.control_dependencies[xi_]: 
    out_ = tf.scatter_update(out, [xi], [tf.cast(numOne, tf.float32)]) 
    with tf.control_dependencies[out_]: 
     step = tf.group(
      xi.assign(xi_), 
      out.assign(out_) 
     ) 
     for i in range(15): step.run() 
print(out.eval()) 
Verwandte Themen