tensorflow Keras客户损失函数中的列表理解

oknwwptz  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(146)

我想创建我的自定义损失函数。首先,模型的输出形状是(None,7,3)。所以我想将输出拆分为3个列表。但我得到如下错误:

  1. OperatorNotAllowedInGraphError: iterating over `tf.Tensor` is not allowed: AutoGraph did convert this function. This might indicate you are trying to use an unsupported feature.

我认为不支持upper_b_true = [m[0] for m in y_true]。我不知道如何解决这个问题。

  1. class new_loss(tf.keras.losses.Loss):
  2. def __init__(self, tr1, tr2):
  3. super(new_loss, self).__init__()
  4. self.tr1 = tr1
  5. self.tr2 = tr2
  6. def call(self, y_true, y_pred):
  7. #pre-determined value
  8. tr1 = tf.constant(self.tr1)
  9. tr2 = tf.constant(self.tr2)
  10. #sep
  11. upper_b_true = [m[0] for m in y_true]
  12. y_med_true = [m[1] for m in y_true]
  13. lower_b_true = [m[2] for m in y_true]
  14. upper_b_pred = [m[0] for m in y_pred]
  15. y_med_pred = [m[1] for m in y_pred]
  16. lower_b_pred = [m[2] for m in y_pred]
  17. #MSE part
  18. err = y_med_true - y_med_pred
  19. mse_loss = tf.math.reduce_mean(tf.math.square(err))
  20. #Narrow bound
  21. bound_dif = upper_b_pred - lower_b_pred
  22. bound_loss = tf.math.reduce_mean(bound_dif)
  23. #Prob metric
  24. in_upper = y_med_pred <= upper_b_pred
  25. in_lower = y_med_pred >= lower_b_pred
  26. prob = tf.logical_and(in_upper,in_lower)
  27. prob = tf.math.reduce_mean(tf.where(prob,1.0,0.0))
  28. return mse_loss + tf.multiply(tr1, bound_loss) + tf.multiply(tr2, prob)

我试图在执行它的同时对它进行部分注解,但我认为问题出在我提到的列表压缩部分。

l5tcr1uw

l5tcr1uw1#

您应该使用tf.unstack
将给定维数的秩-RTensor分解为秩-(R-1)Tensor。

  1. upper_b_true, y_med_true, lower_b_true = tf.unstack(y_true, axis=-1)

相关问题