gpt4 book ai didi

python - TensorFlow 的 Print 或 K.print_tensor 不会在损失函数中打印中间张量

转载 作者:行者123 更新时间:2023-12-02 00:48:48 25 4
gpt4 key购买 nike

我为 Keras 模型编写了一个相当复杂的损失函数,它在训练时不断返回 nan。因此,我需要在训练时打印中间张量。我知道你不能在损失函数中执行 K.eval 因为张量未初始化。但是,我尝试了 K.print_tensor() 和 tf.Print() ,但都不起作用。

我非常想做这样的事情:

def mean_squared_error(y_true, y_pred):
print("mean_squared_error")
loss = K.mean(K.square(y_pred - y_true), axis=-1)
loss = tf.Print(loss, [loss])
return loss
model.compile(optimizer=self.optimizer, loss=mean_squared_error)

实际上,我会将 mean_squared_error 替换为我的自定义损失。 “mean_squared_error”将被打印,但不会打印我尝试使用 TensorFlow 打印(也不是 Keras 打印)打印的值。我还尝试了与 How do I print inside the loss function during training in Keras? 中完全相同的代码我仍然没有看到控制台中打印任何内容。

此外,我还编写了一个单独的文件来测试一些东西。

import tensorflow as tf
import keras.backend as K

input1 = K.constant(1)
input2 = K.constant(2)
input3 = K.constant(3)

node1 = tf.add(input1, input2)
print_output = K.print_tensor(node1)
output = tf.multiply(print_output, input3)

也没有打印任何内容。

我是否错误地使用了 TensorFlow 的 Print 和 Keras print_tensor?或者结果打印在其他地方?我尝试使用 print("test", file=sys.stderr) 测试控制台的 stderr,并获得了正确的输出 test

为了澄清,我知道您可以使用 K.eval 使测试代码打印出张量的值,但由于我无法在中使用 K.eval我的损失函数,我需要使 tf.Print 或 K.print_tensor 工作。

最佳答案

这里的问题是训练代码通常并不真正依赖于损失张量的值!通常,您可以计算损失的梯度,而无需计算损失的实际值,这意味着 tensorflow 的运行时可以自由地从图中删除损失的实际执行。

您可以将损失函数包装在 tf.contrib.eager.defun 中装饰器,它的副作用是保证函数中的所有有状态操作都运行,即使向后传递不需要它们。

关于python - TensorFlow 的 Print 或 K.print_tensor 不会在损失函数中打印中间张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52023119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com