在Keras中实现基于高斯的损失函数

时间:2018-07-13 08:38:28

标签: python tensorflow keras

我正在尝试使用TensorFlow后端在Keras中实现自定义损失功能。这个想法是让神经网络输入高斯系数,并将四个高斯之和与模型输出进行比较。因此,我们使高斯人适合数据。我想以[a_0,b_0,c_0,a_1,...,c_3]的形式包含y_pred,并计算a_i * e ^((x-b_i)^ 2 / 2c_i)的总和,i = 0 ,1,2,3,然后算出例如将该函数与y_true进行比较的平均绝对误差。我尝试过的是

def gauss_loss(y_true, y_pred):
   # zs is the the size y_true
   # the size of y_pred is 12
   xs = np.linspace(0, 1, zs)
   gauss_sum = 0
   for i in range(0, 12, 3):
        gauss_sum += y_pred[:,i]*K.exp(-(xs-y_pred[:,i+1])**2/(2*y_pred[:,i+2]))
   return 1./zs*sum(K.abs(y_true-gauss_sum))

我收到错误消息“ TypeError:未启用急切执行时,张量对象不可迭代。要使用tf.map_fn迭代此张量”。

但是,我也不认为我可以使用tf.map_fn,因为它只接受一个参数,所以我不能将y_pred的第一个条目用作系数 a ,而将下一个用作 b 在同一公式中。

我发现的所有示例仅对整个矩阵使用张量运算。在我看来,这在Keras中甚至不可能实现。这可能吗?如果可以,怎么办?

0 个答案:

没有答案