1.训练时loss保持一个“看似合理”的固定数值,test时准确率为0。
原因:output和label维度不匹配或output或是label的值为0
2.测试集的准确率始终为0
原因:与问题(1)类似,label或output的值存在问题,有可能是在dataloader里包装的sample时就存在问题。
教训:在dataloader里读取图像的方法尽量少传入类的属性作为参数,这样便于调试。
3.训练时没有问题,测试时“out of memory”
原因:我的网络任务是做图像的分类,因此在测试时,放在cuda上的参数量过大,因此做了如下修改:
#原始
data_var = Variable(data,volatile=True).cuda(async=True)
label_var = Variable(label,volatile=True).cuda(async=True)
#改为如下形式
with torch.no_grad():
data_var = Variable(data).cuda(async=True)
label_var = Variable(data).cuda(async=True)
做了上述修改之后发现还是会报out of memory的问题,后来逐行排查时发现可能是由于我想要保存图片名和output的值到一个字典里的时候,直接将cuda上的output这一tensor保存下来,所以导致占用的空间过大(具体是什么过程还不清楚,但可以确定是这一行报错),因此在保存的时候做了如下修改:
#原始
preds[img_name]=output
#修改为
preds[img_name]=output.data.cpu().numpy()