损失函数中的Keras batch_dot尺寸问题

时间:2020-03-09 19:46:22

标签: python tensorflow keras

我正在创建自定义损失函数。在终端中,我可以编写此代码,该代码可以完美运行

import keras.backend as K
q = K.ones(shape=(32,100,3))
k = K.ones(shape=(32,100,3))
s = 0
for i in range(0, int(q.shape[0]) ):
    s += K.sum(K.batch_dot(q[i], k[i], axes=[1,1] ))
print (K.get_value(s))

9600.0

所以我将其调整为损失函数

def custom_loss(y_true,y_pred):
    s = 0
    for i in range(0, int(y_true.shape[0]) ):
        s += K.sum(K.log(K.batch_dot(y_true[i], y_pred[i], axes=[1,1] )))
    return -s

但是随后我收到此错误消息: enter image description here

我假设y_true.shape无法正常工作,而我在损失函数中所期望的那样。有谁知道我可以如何修复代码以在损失函数中完成相同的总和?

谢谢!

编辑

这是我需要在损失函数中创建的计算的解释。我知道这似乎很奇怪,但这就是我需要创建的。这是一个示例,好像它是用numpy数组计算的。

y_true = np.ones([2,3,4])
y_pred = np.ones([2,3,4])
running_sum = 0
for i in range(0,y_true.shape[0]):
    for j in range(0,y_pred.shape[1]):
        running_sum += np.log( y_true[i,j] @ y_pred[i,j] )
print( running_sum )

1 个答案:

答案 0 :(得分:1)

因此,考虑您的编辑:

  • 假设在2D循环中您正在提取形状为(4,)的向量
  • 假设@运算符是标量积或点积

这很简单:

dot = K.sum(y_true * y_pred, axis=-1)
dotlog = K.log(dot)
return K.sum(dotlog)

如果您打算以后使用某种取决于个性化样本(例如样本权重)的功能,则可以:

return K.sum(..., axis=1)

您可能还喜欢使用keras.losses.cosine_proximity(y_true, y_pred, axis=-1)