Tensorflow 在Keras中创建自定义度量时,y_true和y_pred是什么?

Tensorflow 在Keras中创建自定义度量时,y_true和y_pred是什么?,tensorflow,keras,Tensorflow,Keras,我想用Keras实现我的自定义度量。根据文档,我的自定义度量应该定义为一个函数,它以两个张量作为输入,y_pred和y_true,并返回一个张量值 然而,当优化运行时,我对这些张量y_pred和y_true中到底包含什么感到困惑。它只是一个数据点吗?是整批的吗?整个时代(可能不是)?有没有办法得到这些张量的形状 有人能指出一个值得信赖的地方让我得到这些信息吗?任何帮助都将不胜感激。不确定是否相关,但我使用的是TensorFlow后端 到目前为止,为了回答这个问题,我做了很多尝试: 检查(没有

我想用Keras实现我的自定义度量。根据文档,我的自定义度量应该定义为一个函数,它以两个张量作为输入,
y_pred
y_true
,并返回一个张量值

然而,当优化运行时,我对这些张量
y_pred
y_true
中到底包含什么感到困惑。它只是一个数据点吗?是整批的吗?整个时代(可能不是)?有没有办法得到这些张量的形状

有人能指出一个值得信赖的地方让我得到这些信息吗?任何帮助都将不胜感激。不确定是否相关,但我使用的是TensorFlow后端


到目前为止,为了回答这个问题,我做了很多尝试:

  • 检查(没有关于这些张量是什么的解释)
  • 通过查看Keras实现中的其他指标来检查并试图理解这些张量(这似乎表明
    y_true
    y_pred
    具有整个批次的标签,但我不确定)
  • 阅读这些stackoverflow问题:、和其他(没有人回答我的问题,大多数集中在OP上,没有清楚地理解张量和在会话期间使用该张量计算的值之间的差异)
  • 通过定义如下度量,在优化过程中打印
    y\u true
    y\u pred
    的值:
def测试度量(y_真,y_pred):
y_真=K.print_张量(y_真)
y_pred=K.print_张量(y_pred)
返回y_true-y_pred

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

y\u true
是真实值(标签)。而
y_pred
是您的神经网络模型预测的值

张量的大小(形状)取决于批次(nb_批次)的大小

是真是假 张量
y_true
是传递给拟合方法的真实数据(或目标、基本事实)。
它是numpy数组
y列
到张量的转换

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

通常,
y\u true
y\u pred
的形状完全相同。一些损失,例如稀疏的损失,可以接受不同形状的损失


y\u true的形状
它包含一整批。它的第一个维度始终是批大小,并且它必须存在,即使批只有一个元素

找到
y\u true
形状的两种非常简单的方法是:

  • 检查真实/目标数据:
    打印(Y\u train.shape)
  • 检查您的
    model.summary()
    并查看最后的输出
但它的第一个维度是批量大小

因此,如果最后一层输出
(无,1)
,则
y\u true
的形状为
(批次,1)
。如果最后一层输出
(无,200200,3)
,则
y\u true
将是
(批次,200200,3)


自定义度量和损失函数 不幸的是,打印自定义度量将不会显示其内容(除非您在上使用“渴望模式”,并且您已使用数据计算了模型的每个步骤)。
例如,您可以通过
打印(K.int\u shape(y\u pred))
查看它们的形状

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

但是,即使度量的结果是多维的,keras也会自动找到方法为该度量输出单个标量。(不确定操作是什么,但很可能是表下隐藏的
K.mean()
——返回整个批次很有趣,因此Keras应用了其他操作,例如样本权重)

来源。在你习惯了keras之后,通过简单地阅读这一部分,这种理解变得自然:

y\u true:true标签。无张量/张量流张量。
y\u pred:预测。与y_形状相同的no/TensorFlow张量为真

真标签表示真/目标数据。标签在这里是一个选择不当的词,它只是分类模型中真正的“标签”。

预测是指模型的结果。

y\u true是目标值,y\u pred是模型的预测值。 函数中的参数位置也很重要。您可以通过只实现一个示例进行检查,并且可以使用函数作为度量来观察。
注意:-在检查此属性时,避免使用验证拆分,因为没有足够的示例进行拆分,也避免缩放示例以获得更好的可视化效果

此选项可能有助于@AlexOzerov:谢谢。我读过,但我不清楚这有什么帮助,你能详细解释一下吗?谢谢!我有一个问题!你能再详细解释一下你的答案吗?假设我的分类器网络的输出是N维的(即N类的pmf),我的批量大小是B。那么,例如,
y_true
,其形状将是(N,B)或(B,N)?或者别的什么?还有,你能指出任何支持你陈述的参考资料吗?我有一个关于你的问题。我的训练数据(numpy数组)具有形状(100,)。但是,在度量内部,例如精度,它具有形状(张量形状([维度(无),维度(无)])。然后,在keras精度度量中,他们计算K.max(y_真,轴=-1)。第二个维度是什么?为什么他们将argmax取到此维度而不是第一个维度?如果“yTrain.”是(100,),则可能将其更改为(100,1)。此精度指标假设您使用的是一个热类。好的。因此,当不使用一个热类时,我必须将精度计算更改为
K.max(y_true,a