Keras 中自定义损失函数的问题
Trouble with custom loss function in Keras
我在向 binary_crossentropy 添加惩罚时遇到问题。这个想法是在预定义错误组的平均值超过某个阈值时惩罚损失函数。
下面是辅助函数,它采用表示组的掩码和已计算的交叉熵。它只会 return 违反某个阈值的次数来惩罚调用它的实际损失函数。
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 不是标量,我想不出一个简单的方法来将它与阈值进行比较。
您必须使用 张量 和来自 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.
我在向 binary_crossentropy 添加惩罚时遇到问题。这个想法是在预定义错误组的平均值超过某个阈值时惩罚损失函数。 下面是辅助函数,它采用表示组的掩码和已计算的交叉熵。它只会 return 违反某个阈值的次数来惩罚调用它的实际损失函数。
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 不是标量,我想不出一个简单的方法来将它与阈值进行比较。
您必须使用 张量 和来自 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.