首先,让我们来了解一下"FailedPreconditionError"的含义。它是TensorFlow的一个错误类型,表示一个运行时前提条件失败,通常是由于变量未正确初始化或出现歧义的情况下尝试更改它。
如果我们看到"FailedPreconditionError: Expected to mark a variable but no variable was given"这个错误,它意味着代码中存在问题,试图更改名为空的变量。在TensorFlow中,通常会给变量(例如,tf.Variable())分配一个名称,这个名称在调用其它操作时很重要。如果变量名称未正确设置,就会出现这种错误。
以下是一些可能导致此错误的示例场景和解决方法:
未给变量命名
import tensorflow as tf
v = tf.Variable([1.0,2.0])
with tf.GradientTape() as tape: output = tf.math.log(v)
grads = tape.gradient(output, v)
# 更改名称为None会导致错误
checkpoint = tf.train.Checkpoint(model=v, optimizer=optimizer)
manager = tf.train.CheckpointManager(checkpoint, './tf_ckpts', max_to_keep=3)
manager.save()
在此示例中,Variable未正确命名为“v”。我们可以通过将其命名为“v”来解决问题。
import tensorflow as tf
# 命名v
v = tf.Variable([1.0, 2.0], name='v')
with tf.GradientTape() as tape:
output = tf.math.log(v)
grads = tape.gradient(output, v)
checkpoint = tf.train.Checkpoint(model=v, optimizer=optimizer)
manager = tf.train.CheckpointManager(checkpoint, './tf_ckpts', max_to_keep=3)
manager.save()
可以看到,在正确命名变量后,代码没有报错。
错误使用checkpoint
and CheckpointManager
import tensorflow as tf
v = tf.Variable([1.0,2.0], name="v")
optimizer = tf.optimizers.SGD(0.5)
checkpoint = tf.train.Checkpoint(model=v, optimizer=optimizer)
manager = tf.train.CheckpointManager(checkpoint, './tf_ckpts', max_to_keep=3)
manager.save()
在此示例中,我们试图使用CheckpointManager保存检查点。但是,我们首先需要通过使用optimizer.apply_gradients(gradszip(grads, [v]))
或 optimizer.minimize(loss, var_list=[v])
来更新变量v,以便它可以被保存。
import tensorflow as tf
v = tf.Variable([1.0, 2.0], name="v")
optimizer = tf.optimizers.SGD(0.5)
with tf.GradientTape() as tape:
loss = tf.math.log(v[0])
grads = tape.gradient(loss, v)
optimizer.apply_gradients(grads_and_vars=zip(grads, [v]))
checkpoint = tf.train.Checkpoint(model=v, optimizer=optimizer)
manager = tf.train.CheckpointManager(checkpoint, './tf_ckpts', max_to_keep=3)
manager.save()
现在我们正确使用了optimizer和CheckpointManager来保存变量。
总结
如果我们看到"FailedPreconditionError: Expected to mark a variable but no variable was given"这个错误,那么很可能是由于变量未正确初始化或名称未正确设置。我们需要检查代码并确保变量命名正确,同时确保我们正确使用了optimizer和CheckpointManager来更新和保存变量。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解TensorFlow报”FailedPreconditionError: Expected to mark a variable but no variable was given “的原因以及解决办法 - Python技术站