我正在创建自定义损失函数。在终端中,我可以编写此代码,该代码可以完美运行
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
我假设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 )
答案 0 :(得分:1)
因此,考虑您的编辑:
(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)