我想在{CNTK / Python>中使用Wiki: Sørensen–Dice coefficient作为损失函数。如何定义自定义损失函数。
答案 0 :(得分:2)
import numpy as np
import cntk as C
def dice_coefficient(x, y):
# https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient
intersection = C.reduce_sum(C.element_times(x, y))
return 2 * intersection / (C.reduce_sum(x) + C.reduce_sum(y))
shape = (1, 2, 2)
x1 = np.ones(shape)
y1 = np.reshape([0, 1, 0, 1], shape)
x = C.sanitize_input(x1)
y = C.sanitize_input(y1)
dice_coefficient(x, y).eval({x: x1, y: y1})
数组([0.66666669],dtype = float32)
答案 1 :(得分:2)
回答更一般的问题“如何定义自定义丢失函数:”
在CNTK中,损失函数并不特殊。任何导致标量的表达式都可以用作损失函数。学习者将通过总结小批量中所有样本的标量损失值来计算小批量级别的损失,并通过任何CNTK表达式反向传播。
例如,以下是定义平方误差损失的方法:
def my_square_error(x,y):
diff = x-y
return times_transpose(diff, diff)
并且cross_entropy_with_softmax()
丢失可以用Python编写:
def my_cross_entropy_with_softmax(output, labels):
logZ = reduce_log_sum(output) # log of softmax denominator
return times_transpose(labels, output) - logZ
最后,通过使用损失函数可以轻松实现多任务学习,该函数是多个损失的加权和。