在 pytorch 中追溯已弃用的警告

Posted

技术标签:

【中文标题】在 pytorch 中追溯已弃用的警告【英文标题】:Tracing back deprecated warning in pytorch 【发布时间】:2020-05-20 20:35:44 【问题描述】:

我正在使用以下代码在我的数据上训练 yolov3: https://github.com/cfotache/pytorch_custom_yolo_training/

但我收到了这个烦人的弃用警告

Warning: indexing with dtype torch.uint8 is now deprecated, please use a dtype torch.bool instead. (expandTensors at /pytorch/aten/src/ATen/native/IndexingUtils.h:20)

我尝试使用python3 -W ignore train.py 我尝试添加:

import warnings
warnings.filterwarnings('ignore')

但警告仍然存在。

我在 *** 上找到了这段代码,它在警告中打印该堆栈,

import traceback
import warnings
import sys

def warn_with_traceback(message, category, filename, lineno, file=None, line=None):

    log = file if hasattr(file,'write') else sys.stderr
    traceback.print_stack(file=log)
    log.write(warnings.formatwarning(message, category, filename, lineno, line))

warnings.showwarning = warn_with_traceback

这就是我得到的:

  File "/content/pytorch_custom_yolo_training/train.py", line 102, in <module>
   loss = model(imgs, targets)
  File "/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py", line 532, in __call__
    result = self.forward(*input, **kwargs)
  File "/content/pytorch_custom_yolo_training/models.py", line 267, in forward
    x, *losses = module[0](x, targets)
  File "/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py", line 532, in __call__
    result = self.forward(*input, **kwargs)
  File "/content/pytorch_custom_yolo_training/models.py", line 203, in forward
    loss_x = self.mse_loss(x[mask], tx[mask])
  File "/usr/lib/python3.6/warnings.py", line 99, in _showwarnmsg
    msg.file, msg.line)
  File "/content/pytorch_custom_yolo_training/train.py", line 29, in warn_with_traceback
    traceback.print_stack(file=log)
  /pytorch/aten/src/ATen/native/IndexingUtils.h:20: UserWarning: indexing with dtype torch.uint8 is now deprecated, please use a dtype torch.bool instead.

转到堆栈中提到的文件和函数,我没有找到任何 uint8 。 我该如何解决问题甚至停止收到这些警告?

【问题讨论】:

【参考方案1】:

发现问题。 线路:loss_x = self.mse_loss(x[mask], tx[mask]) mask 变量是 ByteTensor 已弃用。只需将其替换为BoolTensor

【讨论】:

【参考方案2】:

这适用于我的情况:添加

obj_mask = obj_mask.type(torch.BoolTensor)
noobj_mask = noobj_mask.type(torch.BoolTensor)

之前

loss_x = self.mse_loss(x[obj_mask], tx[obj_mask])

in models.py.

【讨论】:

请不要添加 "thanks" 作为答案。它们实际上并没有提供问题的答案,并且可能被未来的访问者视为噪音。一旦你earn足够reputation,你将获得upvote answers你喜欢的特权。这样,问题的未来访问者将看到对该答案的更高投票数,并且回答者也将获得声誉积分奖励。见Why is voting important。【参考方案3】:

这很好用

obj_mask = obj_mask.bool()
noobj_mask = noobj_mask.bool()

【讨论】:

以上是关于在 pytorch 中追溯已弃用的警告的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flex 3 中禁用已弃用的警告?

ConnectivityManager.TYPE_WIFI 在代码中显示已弃用。我在 M 以上版本中使用了网络功能,想要删除已弃用的警告

为啥 C++ 已弃用的警告会打印两次?

Alamofire 已弃用的代码

Apple 警告 ITMS-90809:收到已弃用的 API 使用情况

在 Android 中,如何删除已弃用的通知变量?