在Tensorflow中的自定义损失函数中智能处理y_pred和y_true块

时间:2020-06-08 15:56:42

标签: python tensorflow

在我的Tensorflow模型中,y_pred包含从0到1的概率,而y_true包含0和1的标签。

在我的自定义损失函数中,我想使用4对(或n对)y_true和y_pred连续对的信息。

在numpy中,我可以做类似的事情

y_true=np.array([1,1,1,1,0,0,0,])
y_pred=np.array([0.5,0.5,0.5,0.5,0.2,0.2,0.2,0.2])

def custom_loss(y_true, y_pred):
    n=len(t)
    res= 0
    for i in range(0,n,4):
        res += np.sum(y_true[i:i+4])-np.sum(y_pred[i:i+4])
    return res

在Tensorflow中是否可以使用张量实现这一目标?

我正在使用Tensorflow 2.2.0和python 3.8

1 个答案:

答案 0 :(得分:1)

注意len(y_true) % 4 != 0的时间:

@tf.function
def custom_loss_tf(y_true, y_pred):
  length = tf.shape(y_true)[0]
  end_i = length % 4
  start_y_true, end_y_true = y_true[:length-end_i], y_true[length-end_i:]
  start_y_pred, end_y_pred = y_pred[:length-end_i], y_pred[length-end_i:]
  sum_start_y_true = tf.reduce_sum(tf.reshape(start_y_true, (-1,4)), axis=0)
  sum_start_y_pred = tf.reduce_sum(tf.reshape(start_y_pred, (-1,4)), axis=0)
  res = tf.reduce_sum(tf.cast(sum_start_y_true, tf.float32)) - tf.reduce_sum(tf.cast(sum_start_y_pred, tf.float32))
  res_ending = tf.reduce_sum(tf.cast(end_y_true, tf.float32) - tf.cast(end_y_pred, tf.float32))
  return res_ending + res

尽管您的函数没有多大意义,但您正在计算总和。你不能把所有东西都加起来吗?