定制加权损失(中国大陆)

2024-05-19 12:35:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我喜欢计算加权误差如下:

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是预测概率,目标是一个热阵列,权重是2D数组。我在下面创建了相应的自定义损失:

^{pr2}$

当我试着训练时,我注意到虽然自定义损耗确实在减少,但是calc_err(pred,targets,weights)的测试误差只会减少一到两个时间段,或者根本没有减少。我的加权交叉熵(z,targets)正常还是我做错了什么?在


Tags: iscalcelement误差errtargetstimesweights
2条回答

权重是常数还是参数?请确保这两个函数使用相同的输入、参数和常量。在

预加权是如何计算的:

def ColBasedCustomWeight(nClass) :
    ratio = 1.0
    pfSum = [0] * nClass
    pWs = [[0 for x in range(nClass)] for y in range(nClass)]
    for j in range(nClass):
        for i in range(nClass):
            n = i - j
            if n > 0: 
                # false negative if j = 0
                pWs[j][i] = math.pow(1.5,ratio*n) if j == 0 else math.pow(1.2,ratio*n) 
            elif n < 0:
                # false positive if i = 0
                pWs[j][i] = math.pow(1.5, -ratio*n) if i == 0 else math.pow(1.2, -ratio*n)
            else: 
                pWs[j][i] = 1.0
            pfSum[i] += pWs[j][i]

    #normalize the weights to nClass
    for  j in range(nClass):
        for i in range(nClass):
            pWs[j][i] *= nClass / pfSum[i]

    return pWs

重量定义或计算有什么问题吗?在

相关问题 更多 >