fluid.layers.smooth_l1
- 作用:该layer计算变量 x 和 y 的smooth L1 loss,它以 x 和 y 的第一维大小作为批处理大小。对于每个实例,按元素计算smooth L1 loss,然后计算所有loss。输出变量的形状是[batch_size, 1]
- 链接:pp飞桨API说明
问题一:输入数据类型
# pytorch code
loss_bbox_x = F.smooth_l1_loss(bbox_x[active], bbox_x_tar[active], reduction='none')
# paddlepaddle code
loss_bbox_x = fluid.layers.smooth_l1(bbox_x[active], bbox_x_tar[active])
报错:Smooth_L1 只能用’float32’, 且输入shape与torch不能,rank>1
解决:
# paddlepaddle code
loss_bbox_x = fluid.layers.smooth_l1(fluid.layers.cast(fluid.layers.unsqueeze(fluid.layers.gather(bbox_x, index), 0), 'float32'),
fluid.layers.cast(fluid.layers.unsqueeze(fluid.layers.gather(bbox_x_tar, index), 0), 'float32'))
问题二:注意输出的维度
输出loss shape 为 [1, 1]
# paddlepaddle code
loss_bbox_x = fluid.layers.smooth_l1(fluid.layers.reshape(fluid.layers.gather(bbox_x, index_active), [1, -1]),
fluid.layers.reshape(fluid.layers.gather(bbox_x_tar, index_active), [1, -1]))
输出loss shape 为[N, 1]
# paddlepaddle code
loss_bbox_x = fluid.layers.smooth_l1(fluid.layers.reshape(fluid.layers.gather(bbox_x, index_active), [-1, 1]),
fluid.layers.reshape(fluid.layers.gather(bbox_x_tar, index_active), [-1, 1]))