Тензор, который вы пытаетесь присвоить новому значению в цикле while, является результатом последовательности нескольких операций-тензоров (операция - это узел в графе, а тензор - это направленное ребро). В частности, цикл while выдаст:
Variable/Read-->while/Enter-->while/Merge-->while/Switch-->while/Identity
Здесь вы пытаетесь присвоить тензор while/Identity
.
tf.while_loop
обычно используется для итерации по измерениям тензора (также по None
- неизвестному измерению). Вы пытаетесь перебрать переменные, которые полностью определены. Вам не нужно создавать tf.while_loop
для этого. Просто создайте операции, которые обновляют каждую переменную, и сгруппируйте эти операции вместе:
update_ops = [w.assign(w + 0.001) for w in weights]
update_op = tf.group(update_ops)
Теперь, когда вы выполните update_op
с интерфейсом tf.Session()
, он обновит все переменные.
Пример:
import tensorflow as tf
v1 = tf.Variable(tf.ones((1, 2), dtype=tf.float32))
v2 = tf.Variable(2*tf.ones((1, 3), dtype=tf.float32))
update_ops = [w.assign(w + 0.001) for w in [v1, v2]]
update_op = tf.group(update_ops)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print('before update:')
print(v1.eval(), v2.eval())
print('after update:')
sess.run(update_op) # <-- update your variables
print(v1.eval(), v2.eval())
# before update:
# [[1. 1.]] [[2. 2. 2.]]
# after update:
# [[1.001 1.001]] [[2.001 2.001 2.001]]