在自定义Keras度量中获取y_pred和y_true长度

时间:2019-02-10 12:57:06

标签: tensorflow keras deep-learning metrics

背景:

我想在自定义Keras指标中检索 y_pred y_true len(x)x.shape[0]的相等值,而不使用Keras后端

考虑一个最小的Keras指标示例:

from keras import backend as K

def binary_accuracy(y_true, y_pred):
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)

这里y_pred和y_true是张量,表示某种形状的numpy数组。

问题:

如何获取keras度量函数内部基础数组的长度,以使所得代码采用以下形式:

def binary_accuracy(y_true, y_pred):
    # some Keras backend code 
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)

注意:该代码必须是Keras后端代码,以便它可在任何Keras后端上使用。

我已经尝试过K.ndim(y_pred),即使实际上长度为45,它也返回2;而K.int_shape(y_pred)则返回None。

2 个答案:

答案 0 :(得分:1)

您需要记住,在某些情况下,直到将值馈送到该张量所依赖的特定占位符之后,才能确定给定符号张量的形状(例如y_true和y_pred)。

请记住,您有两个选择:

  1. 使用K.int_shape(x)获取表示输入张量x形状的int和Nones元组。在这种情况下,长度不确定的尺寸将为“无”。 如果您的非Tensorflow代码不依赖于 尺寸不确定。例如您不能执行以下操作:

    if K.shape(x)[0] == 5:
        ...
    else:
        ...
    
  2. 使用K.shape(x)获得象征性的张量,该张量表示 张量x。 如果您想使用张量的形状来更改TF图,例如:

    t = tf.ones(shape=K.shape(x)[0])

答案 1 :(得分:0)

您可以通过K.int_shape(x)访问张量的形状 通过获取结果的第一个值,您将获得基础数组的长度:K.int_shape(x)[0]