在Keras中创建自定义指标时,y_true和y_pred是什么?

时间:2017-10-10 09:18:41

标签: tensorflow keras

我想在Keras中实现自定义指标。根据文档,我的自定义指标应定义为一个函数,它将两个张量y_predy_true作为输入,并返回单个张量值。

但是,我很困惑在优化运行时这些张量y_predy_true中确切包含的内容。它只是一个数据点吗?这是整批吗?整个时代(可能不是)?有没有办法获得这些张量的形状?

有人可以指向值得信赖的地方,我可以获取此信息吗?任何帮助,将不胜感激。不确定是否相关,但我正在使用TensorFlow后端。

到目前为止我尝试过的事情,为了回答这个问题:

  • 检查Keras metrics documentation(没有解释这些张量是什么)。
  • 检查source code for the Keras metrics并尝试通过查看其他指标的Keras实现来了解这些张量(这似乎表明y_truey_pred具有整批的标签,但我不确定。)
  • 阅读这些stackoverflow问题:123和其他人(没有回答我的问题,大多数都集中在OP上,不清楚张力与张量之间的区别在会话期间使用该张量计算的值。)
  • 在优化过程中打印y_truey_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

(遗憾的是,这些在优化过程中不会打印任何内容)。

3 个答案:

答案 0 :(得分:16)

y_true和y_pred

张量y_true是您传递给fit方法的真实数据(或目标,基础事实)。
它是将numpy数组y_train转换为张量。

张量y_pred是您的模型预测(计算,输出)的数据。

y_truey_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)

自定义指标和损失函数

不幸的是,打印自定义指标不会显示其内容。 例如,您可以使用print(K.int_shape(y_pred))查看其形状。

请记住,这些库首先“编译图形”,然后“运行数据”。当您定义损失时,您处于编译阶段,并且要求数据需要模型运行。

但即使您的指标的结果是多维的,keras也会自动找到为该指标输出单个标量的方法。 (不确定操作是什么,但很可能隐藏在表下的K.mean())。

源。在你习惯了keras之后,只需阅读这部分就可以理解这种理解:

  

y_true:真实标签。 Theano / TensorFlow张量。
   y_pred:预测。 Theano / TensorFlow张量与y_true形状相同。

真实标签表示真实/目标数据。标签在这里是一个选择不好的词,它只是分类模型中真正的“标签” 预测意味着您的模型的结果。

答案 1 :(得分:1)

{ "reason": "No data retrieved for GET call", "response": "failure" } 是真实值(标签)。并且y_true是您的NN模型预测的值。

张量的大小(形状)受到批次大小(nb_batches)的影响。

答案 2 :(得分:0)

y_true是目标值,y_pred是模型的预测值。 函数中的参数位置也很重要。您可以仅通过实现一个示例来进行检查,也可以通过将该函数用作指标来进行观察。 注意:-在检查此属性时,请避免使用验证拆分,因为没有足够的示例来进行拆分,还请避免缩放示例以实现更好的可视化效果