我正在尝试使用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中甚至不可能实现。这可能吗?如果可以,怎么办?