【问题标题】:Trouble with custom loss function in KerasKeras 中自定义损失函数的问题
【发布时间】:2018-03-18 15:56:21
【问题描述】:

我无法为 binary_crossentropy 添加惩罚。这个想法是在预定义的错误组的平均值超过某个阈值时惩罚损失函数。 下面是辅助函数,它采用表示组的掩码和已经计算的交叉熵。它只会返回违反某个阈值的次数,以惩罚调用它的实际损失函数。

def penalty(groups_mask, binary_crossentropy):
  errors = binary_crossentropy
  unique_groups = set(groups_mask)
  groups_mask = np.array(groups_mask)
  threshold = # whatever
  c = 0
  for group in unique_groups:
      error_mean = K.mean(errors[(groups_mask == group).nonzero()], axis=-1)
      if error_mean > threshold:
        c += 1
  return c

问题在于 error_mean 不是一个标量,我想不出一个简单的方法来将它与阈值进行比较。

【问题讨论】:

  • 我实在看不懂你想在这行实现什么:error_mean = K.mean(errors[(groups_mask == group).nonzero()], axis=-1)

标签: python deep-learning keras theano data-science


【解决方案1】:

您必须使用 张量 和 keras 中的函数 backend

import keras.backend as K

在错误行中,您也必须使用这些函数进行比较:

....
c = K.variable([0])
.....
.....
    errorGreater = K.cast(K.greater(error_mean,threshold), K.floatx())
    c+=K.max(errorGreater) #if error_mean is 1 element only, you can just c+=errorGreater.

【讨论】:

  • 我认为theano允许你不使用cast
猜你喜欢
  • 2018-05-25
  • 2020-12-19
  • 2017-12-18
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 2017-12-29
相关资源
最近更新 更多