我正在使用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
有时(很少)有两个(或更多)值而不是一个。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句