【发布时间】:2017-09-11 09:23:40
【问题描述】:
我喜欢在下面计算加权误差:
def calc_err(pred, targets, weights) :
nClass = np.size(pred, axis=0)
Is = [1.0 for i in range(nClass)]
nonTargets = C.minus(Is, targets)
wrongPred = C.minus(Is, pred)
wColumn = C.times(targets, weights)
wTarget = C.element_times(wColumn, targets)
wNonTarget = C.element_times(wColumn, nonTargets)
c1 = C.negate(C.reduce_sum(C.element_times(wTarget, C.log(pred)), axis = -1))
c2 = C.negate(C.reduce_sum(C.element_times(wNonTarget, C.log(wrongPred)), axis = -1))
ce = c1 + c2
return ce.eval()
pred 是预测概率,targets 是 one-hot 数组,weights 是 2D 数组。我在下面创建了一个相应的自定义损失:
def WeightedCrossEntropy(z, targets):
pred = C.softmax(z)
nClass = np.size(pred, axis=0)
Is = [1 for i in range(nClass)]
nonTargets = C.minus(Is, targets)
wrongPred = C.minus(Is, pred)
wColumn = C.times(targets, weights)
wTarget = C.element_times(wColumn, targets)
wNonTarget = C.element_times(wColumn, nonTargets)
c1 = C.negate(C.reduce_sum(C.element_times(wTarget, C.log(pred)), axis=-1))
c2 = C.negate(C.reduce_sum(C.element_times(wNonTarget, C.log(wrongPred)), axis=-1))
ce = c1 + c2
return ce
当我尝试训练时,我注意到虽然自定义损失确实在减少,但来自 calc_err(pred, targets, weights) 的测试误差只减少一两个时期或根本不减少。我的 WeightedCrossEntropy(z, targets) 是否正常或我做错了什么?
【问题讨论】: