首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从磁盘加载torchvision模型?

如何从磁盘加载torchvision模型?
EN

Stack Overflow用户
提问于 2021-10-11 09:31:07
回答 2查看 413关注 0票数 1

我正在尝试遵循top answer here中的解决方案,从.pth文件中加载一个对象检测模型。

代码语言:javascript
复制
os.environ['TORCH_HOME'] = '../input/torchvision-fasterrcnn-resnet-50/' #setting the environment variable
model = detection.fasterrcnn_resnet50_fpn(pretrained=False).to(DEVICE)

我得到以下错误

代码语言:javascript
复制
NotADirectoryError: [Errno 20] Not a directory: '../input/torchvision-fasterrcnn-resnet-50/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth/hub'

谷歌没有透露这个错误的答案,我也不知道它到底是什么意思,除了显而易见的(那个文件夹'hub‘不见了)。

我是否必须解包或创建文件夹?我已经尝试加载权重,但得到相同的错误消息。

这就是我加载模型的方式

代码语言:javascript
复制
model = detection.fasterrcnn_resnet50_fpn(pretrained=True)
checkpoint = torch.load('../input/torchvision-fasterrcnn-resnet-50/model.pth.tar')
model.load_state_dict(checkpoint['state_dict'])

谢谢你的帮助!

完整错误跟踪:

代码语言:javascript
复制
gaierror: [Errno -3] Temporary failure in name resolution

During handling of the above exception, another exception occurred:

URLError                                  Traceback (most recent call last)
/tmp/ipykernel_42/1218627017.py in <module>
      1 # to load
----> 2 model = detection.fasterrcnn_resnet50_fpn(pretrained=True)
      3 checkpoint = torch.load('../input/torchvision-fasterrcnn-resnet-50/model.pth.tar')
      4 model.load_state_dict(checkpoint['state_dict'])

/opt/conda/lib/python3.7/site-packages/torchvision/models/detection/faster_rcnn.py in fasterrcnn_resnet50_fpn(pretrained, progress, num_classes, pretrained_backbone, trainable_backbone_layers, **kwargs)
    360     if pretrained:
    361         state_dict = load_state_dict_from_url(model_urls['fasterrcnn_resnet50_fpn_coco'],
--> 362                                               progress=progress)
    363         model.load_state_dict(state_dict)
    364     return model

/opt/conda/lib/python3.7/site-packages/torch/hub.py in load_state_dict_from_url(url, model_dir, map_location, progress, check_hash, file_name)
    553             r = HASH_REGEX.search(filename)  # r is Optional[Match[str]]
    554             hash_prefix = r.group(1) if r else None
--> 555         download_url_to_file(url, cached_file, hash_prefix, progress=progress)
    556 
    557     if _is_legacy_zip_format(cached_file):

/opt/conda/lib/python3.7/site-packages/torch/hub.py in download_url_to_file(url, dst, hash_prefix, progress)
    423     # certificates in older Python
    424     req = Request(url, headers={"User-Agent": "torch.hub"})
--> 425     u = urlopen(req)
    426     meta = u.info()
    427     if hasattr(meta, 'getheaders'):

/opt/conda/lib/python3.7/urllib/request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    220     else:
    221         opener = _opener
--> 222     return opener.open(url, data, timeout)
    223 
    224 def install_opener(opener):

/opt/conda/lib/python3.7/urllib/request.py in open(self, fullurl, data, timeout)
    523             req = meth(req)
    524 
--> 525         response = self._open(req, data)
    526 
    527         # post-process response

/opt/conda/lib/python3.7/urllib/request.py in _open(self, req, data)
    541         protocol = req.type
    542         result = self._call_chain(self.handle_open, protocol, protocol +
--> 543                                   '_open', req)
    544         if result:
    545             return result

/opt/conda/lib/python3.7/urllib/request.py in _call_chain(self, chain, kind, meth_name, *args)
    501         for handler in handlers:
    502             func = getattr(handler, meth_name)
--> 503             result = func(*args)
    504             if result is not None:
    505                 return result

/opt/conda/lib/python3.7/urllib/request.py in https_open(self, req)
   1391         def https_open(self, req):
   1392             return self.do_open(http.client.HTTPSConnection, req,
-> 1393                 context=self._context, check_hostname=self._check_hostname)
   1394 
   1395         https_request = AbstractHTTPHandler.do_request_

/opt/conda/lib/python3.7/urllib/request.py in do_open(self, http_class, req, **http_conn_args)
   1350                           encode_chunked=req.has_header('Transfer-encoding'))
   1351             except OSError as err: # timeout error
-> 1352                 raise URLError(err)
   1353             r = h.getresponse()
   1354         except:

URLError: <urlopen error [Errno -3] Temporary failure in name resolution>
EN

回答 2

Stack Overflow用户

发布于 2021-10-11 10:26:29

如果要加载预训练的网络,则不需要从torchvision预训练中加载模型(就像在使用pretrained=True的ImageNet上的torchvision预训练一样)。您有两个选择:

  1. 使用以下命令设置pretrained=False并加载权重:

检查点= torch.load('../input/torchvision-fasterrcnn-resnet-50/model.pth.tar') model.load_state_dict(checkpoint'state_dict')

  1. ,或者如果您决定更改TORCH_HOME (这并不理想),您需要保持相同的目录结构,这将是:

inputs/hub/checkpoints/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth

在实践中,您不会仅仅为了加载一个模型而更改TORCH_HOME

票数 0
EN

Stack Overflow用户

发布于 2021-10-11 11:15:03

我在github中找到了解决方案,这个问题有点隐蔽。

detection.()除了预训练之外还有一个默认参数,名为pretrained_backbone,默认情况下设置为true,如果为True,则设置从urls的字典路径下载模型。

这将会起作用:

代码语言:javascript
复制
detection.fasterrcnn_resnet50_fpn(pretrained=False, pretrained_backbone = False, num_classes = 91).

然后像往常一样加载模型。num_classes是预期的,在文档中是默认值= 91,但在github中我认为它是没有的,这就是为什么我为了安全起见在这里添加了它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69523980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档