繁体   English   中英

keras中的加权MSE自定义损失函数-自定义权重

[英]Weighted mse custom loss function in keras - custom weights

我正在使用序列数据(一个热编码序列),正在寻找一种编写自定义损失函数的方法,该函数使用基于y_pred和y_true的值字典中的权重,并在训练时依赖于这些值(因此我在打电话给fit时不能使用恒定重量。

基本上,对于序列矩阵中每个argmax索引位置,我都可以检索一个字符。 对于每两个字符,我可以获取一个权重。 这些的字典如下:

values = 
     {0: 'A',
      1: 'C',
      2: 'D',
      ...}
matrix = array
     ([[ 4, -1, -2, -2,  0, -1, -1,  0, -2, -1, -1, -1, -1, -2, -1,  1,
         0, -3, -2,  0, -2, -1,  0, -4],
       [-1,  5,  0, -2, -3,  1,  0, -2,  0, -3, -2,  2, -1, -3, -2, -1,
        -1, -3, -2, -3, -1,  0, -1, -4],
       [-2,  0,  6,  1, -3,  0,  0,  0,  1, -3, -3,  0, -2, -3, -2,  1,
         0, -4, -2, -3,  3,  0, -1, -4],
       ...]])

我想做这样的事情:

y_true (n,155,20) ---K.argmax(.., axis=2)---> a:(n,155)

y_pred (n,155,20) ---K.argmax(.., axis=2)---> b:(n,155)

for i in range(n):
   for j in range(155):
      weights[i,j] = matrix[values[a[i,j]], values[b[i,j]]]

想象一下,有一种方法可以通过其他命令将矩阵值提高到上述水平。

然后,我想像这样使用weights矩阵:

def custom_loss_mse(y_true,y_pred):
    w = getWeights(y_true,y_pred)
    return K.mean(K.dot(w, K.square(y_pred-y_true)), axis=-1)

到目前为止,我只发现这个问题很有帮助,但实际上并不太相似。

这很容易,但是由于计算图模型,keras使我更难做。 应该有一些快速的方法来做到这一点,但是我没有想法。

我将不胜感激,因为我对numpy和keras相当陌生。

您可以使用tf.gather来获取特定索引处的张量值。 例如,您可以使用以下代码构造a

index = K.argmax(y_true, axis=2)
a = tf.diag_part(tf.gather(y_true, index, axis=2))  # shape (n, 155)

我认为不可能从字典中获取值,因为所有计算都必须是符号性的。 但是,如果可以使用矩阵而不是字典,则可以将矩阵转换为具有K.constant的张量,然后可以使用与上述相同的方法来获取特定索引处的值,具体取决于输入张量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM