关键词:
【中文标题】pytorch Faster-RCNN 的验证损失【英文标题】:Validation loss for pytorch Faster-RCNN 【发布时间】:2020-06-05 22:10:21 【问题描述】:我目前正在使用从 pytorch 预训练的 Faster-RCNN 模型(例如在 torchvision tutorial 中)的迁移学习对自定义数据集进行对象检测。 我想在每个时期结束时计算验证损失字典(如在训练模式下)。 我可以像这样在训练模式下运行模型进行验证:
model.train()
for images, targets in data_loader_val:
images = [image.to(device) for image in images]
targets = [k: v.to(device) for k, v in t.items() for t in targets]
with torch.no_grad():
val_loss_dict = model(images, targets)
print(val_loss_dict)
但我不认为这是“正确”的验证方式(导致一些特殊层,如 dropout 和 batch norm 在 eval/train 模式下的工作方式不同)。并且在 eval 模式下,模型返回预测的 bbox(如预期的那样)。我可以为此使用一些内置函数吗?
谢谢。
【问题讨论】:
很抱歉,我似乎不太明白这个问题,但有什么反对model.eval()
?
@marhoruf 调用 model.eval()
禁用 dropout 并更改批处理规范以使用历史统计,在验证之前调用它。同样model.train()
应该在训练之前被调用。默认情况下,模块处于训练模式。
这是一个有效的问题。虽然始终计算损失和输出,但目前 torchvision 在训练模式下返回损失 onyl,请参阅此行:github.com/pytorch/vision/blob/…
【参考方案1】:
有一些关于这个问题的讨论here。结论是在训练模式下计算验证损失是绝对有效的。 val loss的数值本身没有意义,只有趋势重要,防止过拟合。因此,虽然训练模式确实改变了损失的数值,但它仍然可以使用。
然而,这里还有另一个效率问题,以防您在验证过程中还需要模型输出(通常用于计算 IoU、准确性等)。现在,torchvision 中的 RCNN 会根据训练/评估模式为您提供损失或输出。
更新: 不幸的是,我意识到此修复程序不起作用。必须修补所有子模块以计算损失和输出。太糟糕了。
我的肮脏解决方案是修补
GeneralizedRCNN
类,其中FasterRCNN
继承。问题出在 this 行,在eager_outputs()
。解决方法:return losses, detections model = fasterrcnn_resnet50_fpn() model.eager_outputs = eager_outputs_patch
现在您可以在单次推理运行后获得两个输出:
model.train() with torch.no_grad(): loss_dict, outputs = model(images, targets). # yaay, now we have both!
请注意,您仍然需要将模型置于训练模式 为了也有损失。在评估模式GeneralizedRCNN
's 子模块(rpn,roi_heads)不计算任何损失,loss_dict
是空的。
【讨论】:
【参考方案2】:我通过编辑Generalized RCNN、RPN、roi_heads解决了这个问题。只需添加一个 if 语句来处理传递目标时即使不在训练模式下仍会计算损失。例如在 RPN 中:
losses =
if self.training:
assert targets is not None
labels, matched_gt_boxes = self.assign_targets_to_anchors(anchors, targets)
regression_targets = self.box_coder.encode(matched_gt_boxes, anchors)
loss_objectness, loss_rpn_box_reg = self.compute_loss(
objectness, pred_bbox_deltas, labels, regression_targets)
losses =
"loss_objectness": loss_objectness,
"loss_rpn_box_reg": loss_rpn_box_reg,
else:
if targets is not None:
labels, matched_gt_boxes = self.assign_targets_to_anchors(anchors, targets)
regression_targets = self.box_coder.encode(matched_gt_boxes, anchors)
loss_objectness, loss_rpn_box_reg = self.compute_loss(
objectness, pred_bbox_deltas, labels, regression_targets)
losses =
"loss_objectness": loss_objectness,
"loss_rpn_box_reg": loss_rpn_box_reg,
【讨论】:
pytorch保留验证集上最好的模型
参考技术A1.在训练过程中,需要保存模型来供测试使用,以前采用隔几个epoch就保存模型:ifepoch%50==0: torch.save(net.state_dict(),'%d.pth'%(epoch))这样会导致保存的模型数量太多,占用硬盘空间,而且训练完成后寻找最优的模型... 查看详情
pytorch 中的交叉熵损失如何工作?
】pytorch中的交叉熵损失如何工作?【英文标题】:Howiscrossentropylossworkinpytorch?【发布时间】:2021-01-2102:27:57【问题描述】:我正在试验一些pytorch代码。通过交叉熵损失,我发现了一些有趣的结果,我同时使用了二元交叉熵损失... 查看详情
交叉熵损失 Pytorch
】交叉熵损失Pytorch【英文标题】:CrossEntropyLossPytorch【发布时间】:2021-08-2510:17:24【问题描述】:我有一个关于在我的pytorch-网络中优化交叉熵损失的问题。我正在构建一个预测体积图片的3D分割的网络。我有一个背景类或一个... 查看详情
使用pytorch保存效果最好那个模型+加载模型(代码片段)
1保存在验证集上表现最好的那一轮模型1验证集的作用就是监督训练是否过拟合;一般默认验证集的损失值经历由下降到上升的阶段;保存在验证集上损失最小的那个迭代模型,其泛化能力应该最好;#在训练部分... 查看详情
Pytorch - 重复损失
】Pytorch-重复损失【英文标题】:Pytorch-RepeatingLoss【发布时间】:2021-07-2508:36:02【问题描述】:我是PyTorch的新手,在显示模型丢失时发现了一个问题。PytorchAdamOptimizer-ModelLossFigurePytorchSGDOptimizer-ModelLossFigure如您所见,模型似乎多... 查看详情
PyTorch 中自定义后向函数的损失 - 简单 MSE 示例中的爆炸损失
】PyTorch中自定义后向函数的损失-简单MSE示例中的爆炸损失【英文标题】:LosswithcustombackwardfunctioninPyTorch-explodinglossinsimpleMSEexample【发布时间】:2021-05-0222:45:56【问题描述】:在处理更复杂的事情之前,我知道我必须实现自己的ba... 查看详情
Pytorch 线性回归损失增加
】Pytorch线性回归损失增加【英文标题】:Pytorchlinearregressionlossincrease【发布时间】:2021-06-2100:08:05【问题描述】:我尝试实现一个简单的演示,得到多项式回归,但线性模型的损失没有减少。我很困惑我哪里出错了。如果我每次... 查看详情
Pytorch 语义分割损失函数
】Pytorch语义分割损失函数【英文标题】:Pytorchsemanticsegmentationlossfunction【发布时间】:2021-07-3018:11:20【问题描述】:我是细分模型的新手。我想使用deeplabv3_resnet50模型。我的图像形状为(256,256,3),我的标签形状为(256,256)。我标签... 查看详情
Pytorch LSTM 模型的损失没有减少
】PytorchLSTM模型的损失没有减少【英文标题】:PytorchLSTMmodel\'slossnotdecreasing【发布时间】:2021-07-2522:58:37【问题描述】:我正在编写一个利用Pytorch中LSTM构建的程序,但是损失总是在一些数字附近,并且没有显着减少。我的模型... 查看详情
在 pytorch 中使用多个损失函数
】在pytorch中使用多个损失函数【英文标题】:Usingmultiplelossfunctionsinpytorch【发布时间】:2021-02-2014:57:12【问题描述】:我正在处理图像恢复任务,我考虑了多个损失函数。我的计划是考虑3条路线:1:使用多个损失进行监控,但... 查看详情
pytorch中序数多分类的损失函数
】pytorch中序数多分类的损失函数【英文标题】:Lossfunctionforordinalmulticlassificationinpytorch【发布时间】:2019-03-1614:57:06【问题描述】:我是DNN和pytorch的初学者。我正在处理一个多分类问题,其中我的标签被编码成一个单热向量,... 查看详情
PyTorch 中的运行损失是啥以及如何计算
】PyTorch中的运行损失是啥以及如何计算【英文标题】:WhatisrunninglossinPyTorchandhowisitcalculatedPyTorch中的运行损失是什么以及如何计算【发布时间】:2020-07-2009:11:15【问题描述】:我查看了PyTorch文档中的this教程以了解迁移学习。有... 查看详情
PyTorch 运行自定义损失函数
】PyTorch运行自定义损失函数【英文标题】:PyTorchGettingCustomLossFunctionRunning【发布时间】:2018-09-2401:21:14【问题描述】:我正在尝试通过扩展nn.Module来使用自定义损失函数,但我无法克服错误变量的元素0不需要grad并且没有grad_fn... 查看详情
Pytorch - 使用一种热编码和 softmax 的(分类)交叉熵损失
】Pytorch-使用一种热编码和softmax的(分类)交叉熵损失【英文标题】:Pytorch-(Categorical)CrossEntropyLossusingonehotencodingandsoftmax【发布时间】:2021-03-1113:32:16【问题描述】:我正在寻找Pytorch中的交叉熵损失函数,它类似于Tensorflow中的C... 查看详情
Pytorch NLLLOSS 的理解
】PytorchNLLLOSS的理解【英文标题】:UnderstandingofPytorchNLLLOSS【发布时间】:2021-11-1808:56:24【问题描述】:PyTorch的负对数似然损失,nn.NLLLoss定义为:因此,如果使用单批次中一个的标准重量计算损失,则损失的公式始终为:-1*(正... 查看详情
上一批Pytorch损失函数错误
】上一批Pytorch损失函数错误【英文标题】:Pytorchlossfunctionerrorinthelastbatch【发布时间】:2019-08-2516:55:02【问题描述】:假设我有77个样本来训练我的CNN,而我的batchsize是10。那么最后一批的batchsize是7而不是10。不知何故,当我将... 查看详情
[python图像识别]四十八.pytorch构建faster-rcnn模型实现小麦目标检测(代码片段)
该系列文章是讲解PythonOpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应... 查看详情
pytorch nn.CrossEntropyLoss() 中的交叉熵损失
】pytorchnn.CrossEntropyLoss()中的交叉熵损失【英文标题】:Crossentropylossinpytorchnn.CrossEntropyLoss()【发布时间】:2018-04-1409:06:25【问题描述】:也许有人可以在这里帮助我。我正在尝试计算我的网络给定输出的交叉熵损失printoutputVariable... 查看详情