我想在 Keras 中实现我的自定义指标。根据文档,我的自定义指标应定义为一个函数,该函数接受两个张量 y_pred 和 y_true 作为输入,并返回单个张量值。
但是,当优化运行时,我对这些张量 y_pred
和 y_true
中到底包含什么内容感到困惑。它只是一个数据点吗?是整批的吗?整个时代(可能不是)?有没有办法获得这些张量的形状?
有人可以指出一个值得信赖的地方,我可以在其中获取此信息吗?任何帮助,将不胜感激。不确定是否相关,但我正在使用 TensorFlow 后端。
<小时/>为了回答这个问题,我到目前为止尝试过的事情:
- 检查 Keras metrics documentation (没有解释这些张量是什么)。
- 检查 source code for the Keras metrics并尝试通过查看其他指标的 Keras 实现来理解这些张量(这似乎表明 y_true 和 y_pred 具有整个批处理的标签,但我不确定)。
- 阅读这些 stackoverflow 问题:1 , 2 , 3 ,以及其他人(没有人回答我的问题,大多数都集中在OP没有清楚地理解张量和 session 期间使用该张量计算的值之间的差异)。
- 在优化期间通过定义如下指标来打印
y_true
和y_pred
的值:
def test_metric(y_true, y_pred):
y_true = K.print_tensor(y_true)
y_pred = K.print_tensor(y_pred)
return y_true - y_pred
(不幸的是,这些在优化过程中不会打印任何内容)。
最佳答案
y_true 和 y_pred
张量 y_true
是您传递给 fit 方法的真实数据(或目标、基本事实)。
它是将 numpy 数组 y_train
转换为张量。
张量y_pred
是模型预测(计算、输出)的数据。
通常,y_true
和 y_pred
具有完全相同的形状。一些损失,例如稀疏损失,可能会接受不同形状的损失。
y_true
的形状
它包含整个批处理。它的第一个维度始终是批处理大小,并且它必须存在,即使批处理只有一个元素。
查找 y_true
形状的两种非常简单的方法是:
- 检查您的真实/目标数据:
print(Y_train.shape)
- 检查您的
model.summary()
并查看最后的输出
但它的第一个维度将是批量大小。
因此,如果最后一层输出 (None, 1)
,则 y_true
的形状为 (batch, 1)
。如果最后一层输出 (None, 200,200, 3)
,则 y_true
将是 (batch, 200,200,3)
。
自定义指标和损失函数
不幸的是,打印自定义指标不会显示其内容(除非您正在使用 eager 模式,并且您已经使用数据计算了模型的每一步)。
例如,您可以使用 print(K.int_shape(y_pred))
查看它们的形状。
请记住,这些库首先“编译图形”,然后“使用数据运行它”。当您定义损失时,您就处于编译阶段,并且请求数据需要模型运行。
但即使您的指标结果是多维的,keras 也会自动找到方法来输出该指标的单个标量。 (不确定是什么操作,但很可能是隐藏在表格下的 K.mean()
- 返回整个批处理很有趣,因此 Keras 应用了其他操作,例如样本权重) .
来源。当你习惯了 keras 后,通过简单地阅读这一部分,这种理解就会变得自然:
y_true: True labels. Theano/TensorFlow tensor.
y_pred: Predictions. Theano/TensorFlow tensor of the same shape as y_true.
真实标签意味着真实/目标数据。标签在这里是一个错误选择的词,它只是分类模型中真正的“标签”。
预测意味着模型的结果。
关于tensorflow - 在 Keras 中创建自定义指标时 y_true 和 y_pred 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46663013/