我正在使用keras / tensorflow,我有一个Single Shot Detector(SSD)模型,该模型在某个时候使用损耗函数,该函数采用y_true
和y_pred
并计算损耗值。
我有兴趣记录本地化和分类损失,因此我尝试调试提供的损失功能。因为,这两个张量都是我试图通过调用来获取值的:
y_true_np = tf.keras.backend.get_value(y_true)
y_pred_np = tf.keras.backend.get_value(y_pred)
在我的情况下会产生CUDA_ERROR_OUT_OF_MEMORY错误。奇怪的是,由于没有足够的GPU内存(我正在那里进行另一个实验),我在CPU(和RAM)中运行了调试程序。
使用tf.keras.backend.eval(y_true)
时也会发生同样的事情(老实说,我不确定这两者之间有什么区别)。
似乎keras试图通过创建一个新的会话(?)并在那里进行评估来返回我要求的值?是这样吗如果是这样,那是为什么呢?另外,如果我尝试强制在CPU中对其进行评估,即使没有上述命令,相同的命令(通过配置文件)也可以正常工作,但它仍会失败。
有人可以解释为什么我会出现这种现象吗?如果我能以某种方式获得张量的实际值。
编辑:
我正在使用的实际代码来自here,但是我不确定是否可以将其简化为一个简单的代码。也许有可能,但是我可能缺少一些其他信息。我所面临的实际问题似乎并不是特定于项目的,并且可能对keras中的每个损失函数都起作用。无论如何,实际损失函数为this one(来自同一项目)。