微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Keras自定义损失函数与类似argwhere的检查

如何解决Keras自定义损失函数与类似argwhere的检查

我正试图在Keras中为生成矩阵的生成器创建自定义损失函数。矩阵由较多的元素和较少的中心组成。与元素相比,中心具有较高的价值-元素具有值<0.1,而中心应达到值>0.5。重要的是,中心必须在正确的正确索引处,而拟合元素则不太重要。这就是为什么我试图造成以下损失的原因:

  1. y_true中选择值为>0.5的所有元素,以numpy的方式执行indices = np.argwhere(y_true>0.5)
  2. 比较y_truey_pred的给定索引处的值,类似loss=(K.square(y_pred[indices]-y_true[indices]))
  3. 选择所有其他元素indices_low = np.argwhere(y_true<0.5)
  4. 与第2步相同,另存为loss_low
  5. 返回加权损失,即return loss*100+loss_low,只是为了给更重要的数据提供更高的权重

但是,我找不到在keras后端实现此目标的方法,我发现a question about tf.where,试图寻找与我的问题类似的东西,但似乎没有类似tf.argwhere(可以吗?无法在文档中找到,均未浏览net / SO)。那我该如何实现呢?

请注意,中心的数量和位置可能会有所不同,并且生成器从一开始就很糟糕,因此它不会生成任何东西,或者生成的方式会超过实际应有的方式,因此我认为我不能简单地使用{{1 }}。我可能不正确,因为我是自定义损失函数的新手,欢迎任何想法。

编辑

毕竟tf.where正是我想要的,所以我尝试了:

K.tf.where

但这总是引发错误

def custom_mse():
    def mse(y_true,y_pred):
        indices = K.tf.where(y_true>0.5)
        loss = K.square(y_true[indices]-y_pred[indices])  
        indices = K.tf.where(y_true<0.5)
        loss_low = K.square(y_true[indices]-y_pred[indices]) 
        return 100*loss+loss_low
    return mse

如何使用ValueError: Shape must be rank 1 but is rank 3 for 'loss_1/Generator_loss/strided_slice' (op: 'StridedSlice') with input shapes: [?,?,?],[1,4],[1]. 输出

解决方法

一段时间后,我终于找到了正确的解决方案,因此将来可能会对某人有所帮助:

首先,我的代码因与numpy和Pandas的长期合作而产生偏差,因此我期望tf元素可以被命名为y_true[indices],实际上内置了函数tf.gather和{{1} }获取张量的元素。但是,由于两种损耗中的元素数量都不相同,因此无法使用它,因为将损耗一起计算会导致尺寸错误。

这使我想到了另一种方法,thanks to this Q&A。了解接受的答案中的代码后,我发现您不仅可以使用tf.gather_nd来获取索引,还可以将遮罩应用于张量。解决我的问题的最终方法是在输入张量上应用两个蒙版并计算两个损失,一个对较高值的损失进行计数,对较低值的损失进行计数,然后将应该具有较高权重的损失相乘。 / p>

tf.where

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。