我有一个网络,该网络输出代表2个正态分布参数的4个值,例如:
[mu1, sigma1, mu2, sigma2]
我想使用对数概率损失函数进行训练,但是我不知道如何实现自定义损失函数。
我尝试了以下定义,但显然不起作用。我看到的所有自定义函数都使用输入值“如此”(例如yPred和yTrue表示相同类型的数据),不需要将这些输入分为不同部分进行损耗计算。
def loss_multivariate_normal(yTrue,yPred):
p1 = -keras.backend.square(yTrue[0][:]-yPred[0][:])/(2*yPred[1][:])
p2 = -keras.backend.log(keras.backend.sqrt(2*math.pi*keras.backend.square(yPred[1][:])))
p3 = -keras.backend.square(yTrue[2][:]-yPred[3][:])/(2*yPred[3][:])
p4 = -keras.backend.log(keras.backend.sqrt(2*math.pi*keras.backend.square(yPred[3][:])))
return p1+p2+p3+p4
当我使用该函数时,会出现此错误
InvalidArgumentError: slice index 2 of dimension 0 out of bounds. [[Node: loss/main_output_loss/strided_slice_4 = StridedSlice[Index=DT_INT32, T=DT_FLOAT, begin_mask=0, ellipsis_mask=0, end_mask=0, new_axis_mask=0, shrink_axis_mask=1, _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_main_output_target_0_1, loss/main_output_loss/strided_slice_2/stack_1, loss/main_output_loss/strided_slice_5/stack, loss/main_output_loss/strided_slice_1/stack_1)]]