-
Notifications
You must be signed in to change notification settings - Fork 6k
Closed
Description
用户反馈在使用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
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels