Keras 中自定义损失函数的批量大小错误

Error in batch size with custom loss function in Keras

我正在使用 Keras 开发一个检测器,其中输出 y_true 包含一个具有 500 个值的向量“y”,其中包含一个脉冲,指示在来自的 500 个样本中检测到的事件时间一个信号。

Ex: y=[0, 0, 0,....,0,1,1,1,1,1,1,1,1,1,1,1,0,....0,0,0]

我之前曾使用 'mse' 作为损失函数,它有效,但我想使用一个损失函数,该函数考虑 y_true 中脉冲的中间值之间的距离和 y_pred 中的最大值。后来我使用 y_pred 中的最大值对其进行归一化并定义其周围的脉冲。

由于我不能仅使用距离并使其可微分,因此我定义了这个自定义损失函数,它用估计距离对均方误差进行加权。

import tensorflow as tf
import keras.backend as kb

def custom_loss_function (y_true, y_pred):
    
    t_label = []
    t_picking = 0    
    t_label = tf.where(y_true == 1)[:,0]    
    mayor = tf.reduce_max(y_pred)
    t_picking = tf.where(y_pred == mayor)[:,0]    
    d = tf.cast(abs(t_label[5]-t_picking)/50,tf.float32)

    loss = (kb.mean(kb.square(y_true-y_pred)))*d

    return loss

其中t_label[5]和t_picking分别是y_trye中脉冲的中间值和y_pred中的最大值。 d是它们之间的距离。

我用这个损失函数编译了模型,使用 Adam 优化器和 64 的批量大小。 一切正常,模型可以编译,但是我在训练过程中出现这个错误:

InvalidArgumentError:  Incompatible shapes: [64] vs. [2]
 [[node Adam/gradients/gradients/loss/dense_1_loss/custom_loss_function/weighted_loss/mul_grad/BroadcastGradientArgs (defined at C:\Users\Maca\anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:3009) ]] [Op:__inference_keras_scratch_graph_2220]

我之前尝试过使用其他自定义损失函数并没有遇到这个问题,但我看不出错误来自哪里。

你知道我为什么会收到这个错误吗?我该如何解决?

特定批次中有两个相等的最大值。所以你的 t_picking 有时(很少)有两个(甚至更多)值而不是一个。