【问题标题】:Act on condition in custom loss function在自定义损失函数中根据条件进行操作
【发布时间】:2021-05-15 08:05:03
【问题描述】:

我在 tensorflow 中定义一个模型,作为损失函数,我编写了自己的自定义损失函数。总的来说,我在正常的 MSE 函数之外加上了一个惩罚项:

return K.mean(K.square(y_true - y_pred)) + penalty

这个惩罚是由一些输入元素和一些目标之间的乘积和总和给出的(我没有报告代码,因为它与问题无关)。

现在,一切正常,但我需要向数据集中添加一种新的示例,其中一些特征和输出的值为零。

因此,在批处理中(在训练期间)两种类型的示例,即具有零值和没有它们的示例,我需要一种适用于整个批处理的条件语句,以便我可以计算 penalty in基于条件评估的两种不同方式。

可以吗?

【问题讨论】:

  • 好像你在找tf.cond
  • 是的,但我不确定我是否可以批量使用它。或者,如果我可以在批处理上使用它,我认为我不能仅根据 tf.cond 的结果对不同的批处理元素应用不同的计算。我正在考虑对批处理元素进行某种循环,然后在每个 tf.cond 上进行循环,但我没有找到类似的东西
  • 贴一个你想做的简单例子,我看看能不能帮忙。
  • 好的,我会清理一下我的自定义丢失,所以我们不需要任何背景知识,然后编辑问题

标签: python tensorflow deep-learning neural-network loss-function


【解决方案1】:

您可以使用tf.where

例如:

  • 如果元素为零,则返回自身
  • 如果元素不为零,则返回 istself + 1
>>> batch_1 = tf.constant([0.,1.,0.,0.5,3.,-2.,0.])
>>> tf.where(batch_1 == 0, batch_1, batch_1+1)
 <tf.Tensor: shape=(7,), dtype=float32, numpy=array([0. , 2. , 0. , 1.5, 4. , -1. , 0. ], dtype=float32)>

它也适用于多维张量,例如:

  • 如果批次的第二个元素为零,则对第一个元素求和
  • 否则,对整个批次求和
>>> a = tf.constant([[1,0,3],[3,4,9],,[8,0,1]],tf.float32)
>>> tf.where(a[:,1]==0,tf.reduce_sum(a[:,:1],axis=1), tf.reduce_sum(a,axis=1))
<tf.Tensor: shape=(3,), dtype=float32, numpy=array([ 1., 16.,  8.], dtype=float32)>

【讨论】:

  • 可能我已经接近了!但我需要类似“如果第 5 个元素为 0,则 DO op1;sum(仅前五个元素);ELSE DO op1;对所有元素求和”之类的东西。 Op1 只是操作数据的东西,但这样做会改变以前为零的东西。
  • 我添加了第二个示例。让我知道是否更清楚。
猜你喜欢
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 2018-02-08
  • 2018-12-08
  • 2018-09-24
  • 1970-01-01
  • 2018-03-01
相关资源
最近更新 更多