Skip to content

用户使用momentum optimizer时出现cast op输入不存在错误 #15283

@sneaxiy

Description

@sneaxiy

用户反馈在使用momentum optimizer时append backward出现cast op错误,用其他optimizer未出现错误。

Paddle版本release 1.2。

code:

def balanced_cross_entropy_bootstrap_loss(prediction, gt_org, average_flag = True, bootstrapped_threshold=0.95):
    class_num = prediction.shape[1]
    #get gt_mask
    gt = fluid.layers.reshape(gt_org, [0, 1, gt_org.shape[-2], gt_org.shape[-1]])

    gt_mask = (gt==0).astype('float32')
    for i in range(1, class_num):
        gt_mask_i = (gt==i).astype('float32')
        gt_mask = fluid.layers.concat([gt_mask, gt_mask_i], axis=1)

    #get valid_mask
    valid_mask =  (gt < class_num).astype('float32')
    valid_mask = fluid.layers.expand(valid_mask, [1, class_num, 1, 1])
    #bootstrap
    prediction = prediction.astype('float32')
    pred = fluid.layers.argmax(prediction, axis=1).astype('float32')
    pred = fluid.layers.reshape(pred, [0, 1, pred.shape[-2], pred.shape[-1]])
    bootstrap_valid1 = (pred == gt).astype('float32')
    bootstrap_valid1 = fluid.layers.expand(bootstrap_valid1, [1, class_num, 1, 1])
    bootstrap_valid2 = (prediction > bootstrapped_threshold).astype('float32')
    bootstrap_valid = fluid.layers.elementwise_mul(bootstrap_valid2, bootstrap_valid1)
    bootstrap_mask = (1.0 - bootstrap_valid).astype('float32')
    #print(bootstrap_mask)
    #print(valid_mask)
    valid_mask = fluid.layers.elementwise_mul(bootstrap_mask, valid_mask).astype('float32')

    #get valid gt_mask
    #gt_mask = fluid.layers.elementwise_mul(gt_mask, valid_mask).astype('float32')

    #get balanced weight
    count_num = fluid.layers.reduce_sum(gt_mask, dim=[2, 3]).astype('float32')
    count_num = fluid.layers.elementwise_max(count_num, fluid.layers.assign(np.array([0.00001], dtype=np.float32)))
    balanced_weight = 1 - count_num/fluid.layers.reduce_sum(count_num, dim=1).astype('float32') #count_num [n,c]
    balanced_gt_mask = fluid.layers.elementwise_mul(gt_mask, balanced_weight, axis=0).astype('float32') #gt_mask=[n,c,h,w] balanced_weight=[n,c]

    prediction = fluid.layers.softmax(prediction).astype('float32')
    prediction = fluid.layers.elementwise_max(prediction, fluid.layers.assign(np.array([0.00001], dtype=np.float32)))
    prediction = fluid.layers.log(prediction).astype('float32')
    loss_mask = fluid.layers.elementwise_mul(prediction, balanced_gt_mask, axis=0)

    if average_flag:
        valid_loss = fluid.layers.reduce_mean(fluid.layers.elementwise_mul(loss_mask, valid_mask))
        #valid_loss = fluid.layers.reduce_mean(loss_mask)
    else:
        valid_loss = fluid.layers.reduce_sum(fluid.layers.elementwise_mul(loss_mask, valid_mask, axis=0))
    return    valid_mask,  -1*valid_loss

错误log(编译期错误):

The input of cast op must be set.

解决方案:将某些不需要梯度的变量设置为stop_gradient=True,例如

bootstrap_mask.stop_gradient = True
valid_mask.stop_gradient = True

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions