2017-03-03 3 views
0

Also, ich habe dieses Stück Code:Warum werden die Variablen in diesem Programm nicht aktualisiert?

graph = tf.Graph() 

with graph.as_default(): 
    res = tf.Variable(
     np.zeros((100, 100), dtype=np.float32) 
    ) 

    mask = tf.placeholder(np.float32, (100, 100)) 
    res = tf.add(res, mask) 

    init = tf.global_variables_initializer() 

with tf.Session(graph=graph) as sess: 
    sess.run(init) 
    for i in range(100): 
     x1, x2, y1, y2 = np.random.randint(0, 100, 4) 
     x1, x2 = sorted((x1, x2)) 
     y1, y2 = sorted((y1, y2)) 

     c_mask = np.zeros((100, 100)) 
     c_mask[x1:x2, y1:y2] = 255 

     new_pic = sess.run([res], feed_dict={mask:c_mask})[0] 

fig = plt.figure() 
ax = fig.add_subplot(111) 

ax.imshow(new_pic.astype('uint8'), cmap='gray') 
fig.show() 

Im Grunde ist es (zumindest soll) zieht 100 zufällig weiße Rechtecke auf einem schwarzen Feld. Aber was ich bekommen, ist dies:

WTF

Ich verstehe nicht. Es sieht so aus, als würde jede Iteration res einfach auf eine schwarze Tafel zurückgesetzt (das Rechteck auf dem Bild ist das letzte, das nach den Koordinaten gezeichnet wurde). Behalte ich es nicht irgendwie, oder was mache ich falsch?

Antwort

1

diese beiden Zeilen ändern:

res = tf.add(res, mask) 
## 
new_pic = sess.run([res], feed_dict={mask:c_mask})[0] 

zu

update_op = res.assign(tf.add(res, mask)) 
## 
new_pic = sess.run([res, update_op], feed_dict={mask:c_mask})[0] 

Ein Tensor sollte mich mit Variable.assign() modifiziert.

Während Sie den Tensor "res" aktualisieren wollten, aktualisiert die erste Zeile sie nicht, sondern erstellt nur einen weiteren Tensor, und dem neuen Tensor wird der Name "" "res" zugewiesen. Daher wird das ursprüngliche res nie aktualisiert.

+0

Das macht Sinn, ja, danke. Ich habe nicht erwartet, dass es einen Unterschied zwischen dem Neuschreiben und dem Modifizieren eines Tensors geben könnte, aber es scheint logisch. – Akiiino

Verwandte Themen