详解TensorFlow报”FailedPreconditionError: Expected to mark a variable but no variable was given “的原因以及解决办法

首先,让我们来了解一下"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技术站

(0)
上一篇 2023年3月18日
下一篇 2023年3月18日

相关文章

合作推广
合作推广
分享本页
返回顶部