将自定义keras度量标准输入分成两个独立的度量标准并找到中位数错误

时间:2019-11-29 02:04:42

标签: tensorflow keras tensorflow-probability keras-metrics

我有一个用于相机姿势网络的ResNet网络。我已经用1024致密层替换了最终的分类器层,然后将其替换为7致密层(对于xyz,前3层;对四元数,最后4层)。

我的问题是我想将xyz错误和四元数错误记录为两个单独的错误或指标(而不是仅仅表示所有7个绝对错误)。 customer_error(y_true,y_pred)的定制度量标准模板的输入是张量。我不知道如何将输入分成两个不同的xyz和q数组。当张量为空并且没有任何numpy分量时,该函数在编译时运行。

最终我想使用

来获取中值xyz和q的错误

中位数= tensorflow_probability.stats.percentile(输入,q = 50,插值='线性')。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以使用tf.slice()仅提取模型输出的前三个元素。


import tensorflow as tf
# enabling eager mode to demo the slice fn
tf.compat.v1.enable_eager_execution()
import numpy as np
# just creating a random array dimesions size (2, 7)
# where 2 is just an arbitrary value chosen for the batch dimension
out = np.arange(0,14).reshape(2,7)
print(out)
# array([[ 0,  1,  2,  3,  4,  5,  6],
#        [ 7,  8,  9, 10, 11, 12, 13]])
# put it in a tf variable
out_tf = tf.Variable(out)
# now using the slice operator
xyz = tf.slice(out_tf, begin=[0, 0], size=[-1,3])
# lets see what it looked like
print(xyz)
# <tf.Tensor: id=11, shape=(2, 3), dtype=int64, numpy=
# array([[0, 1, 2],
#       [7, 8, 9]])>

可以将这样的内容包装到自定义指标中,以获取所需的内容。

def xyz_median(y_true, y_pred):
  """get the median of just the X,Y,Z coords

  UNTESTED though :)
  """
  # slice to get just the xyz
  xyz = tf.slice(out_tf, begin=[0, 0], size=[-1,3])
  median = tfp.stats.percentile(input, q=50, interpolation='linear')
  return median