为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

弑天下 2021-10-26 15:46:11
我正在处理序列数据(一个热编码序列),并且正在寻找一种方法来编写自定义损失函数,该函数使用基于 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 还很陌生。
查看完整描述

1 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

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


index = K.argmax(y_true, axis=2)

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

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


查看完整回答
反对 回复 2021-10-26
  • 1 回答
  • 0 关注
  • 315 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信