该错误可能发生在尝试在 @tf.function
装饰的函数内部将一个 Tensor 转换为 NumPy 数组时。如下,假设你在训练步骤中计算了一个损失值,并希望立即将其值记录下来,你可能会想直接将Tensor转换为numpy:
@tf.function
def train_step(self, data):
inputs, labels = data
with tf.GradientTape() as tape:
predictions = self(inputs, training=True)
loss = self.compiled_loss(labels, predictions, regularization_losses=self.losses)
gradients = tape.gradient(loss, self.trainable_variables)
self.optimizer.apply_gradients(zip(gradients, self.trainable_variables))
# 这里尝试将损失值转换为 NumPy 并记录到 W&B
wandb.log({"loss": loss.numpy()})
但这段代码会报错:AttributeError: 'Tensor' object has no attribute 'numpy'
错误原因
这个错误的根本原因在于 @tf.function
的工作原理。@tf.function
会将 Python 代码转换为 TensorFlow 的计算图(Graph),而在计算图模式下,TensorFlow 的 Te