DAMDNet
DAMDNet copied to clipboard
wing loss
请问在您计算wing loss的时候,作为ground truth的 68个3D人脸点是怎么得到的?
由于缺乏真实3D数据,在利用3DMM回归时的GT一般都是是利用先前方法回归出的3D系数重建三维人脸得到的。因此这个GT具有很多噪声,是一种假的GT。这是一个病态问题,但是目前所有基于这样的文章都能得出较好的结果,因此一定程度上也可以接受。
请问方便分享一下wing loss function部分的代码吗
你好。wing loss代码已经上传。
非常感谢,由于我是初学者,我在学习尝试自己训练时出现 loss 是nan的情况,请问可以帮我看一下代码哪里出错了吗,谢谢! ` def train(train_loader, model, criterion_wpdc, criterion_wing, optimizer_wpdc, optimizer_wing, epoch): batch_time = AverageMeter() data_time = AverageMeter() # 计算并存储平均值和当前值 losses = AverageMeter()
model.train()
end = time.time()
# loader is batch style
# for i, (input, target) in enumerate(train_loader):
# train_loader对应 输入图像input 以及 对应的62维ground truth target
for i, (input, target) in enumerate(train_loader):
target.requires_grad = False
target = target.cuda(non_blocking=True)
output = model(input)
data_time.update(time.time() - end)
#wpdc
loss_wpdc = criterion_wpdc(output, target)
optimizer_wpdc.zero_grad()
loss_wpdc.backward(retain_graph=True)
optimizer_wpdc.step()
#wing
loss_wing = criterion_wing(output, target)
optimizer_wing.zero_grad()
loss_wing.backward(retain_graph=True)
optimizer_wing.step()
losses = 0.5 * loss_wpdc + loss_wing
# measure elapsed time
batch_time.update(time.time() - end)
end = time.time()
# log
if i % args.print_freq == 0:
logging.info(f'Epoch: [{epoch}][{i}/{len(train_loader)}]\t'
f'LR: {lr:8f}\t'
f'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
# f'Data {data_time.val:.3f} ({data_time.avg:.3f})\t'
f'Loss {losses.data.cpu().numpy():.4f} ')
`
你好。一般loss出现Nan可能是在计算loss的时候分母出现了0。你这个代码看不出问题。建议你先判断wingloss和wpdcloss哪个loss出现问题。然后调试程序去看loss计算中哪一步运算出现了0的可能。
你好。一般loss出现Nan可能是在计算loss的时候分母出现了0。你这个代码看不出问题。建议你先判断wingloss和wpdcloss哪个loss出现问题。然后调试程序去看loss计算中哪一步运算出现了0的可能。
你这个代码还有个问题,一般只对最后的总loss进行反传播。不会一次训练传播两次loss。
非常感谢,请问您最终的loss大概在多少,我观察到初始的wingloss大约在30左右,而wpdcloss大约只有0.2,请问在您训练时也是这样的情况吗
你好。wing loss大概在4到5,wpdc loss一般在0.02左右,能够达到比较好的效果